我有 2 個包含一百萬個元素的陣列(從具有每個像素亮度的影像創建)我需要得到一個數字,它是同名陣列元素的乘積之和。即 A(1,1) * B(1,1) A(1,2) * B(1,2)... 在回圈中,python從回圈中取最后一個變數的值(j1 ) 并開始遍歷它,然后將倒數第二個變數加 1 并再次遍歷最后一個變數,依此類推。我怎樣才能讓它計算同名的元素?res1, res2 - 陣列(特別是 - numpy.ndarray) 也許有一個現成的功能,但我需要讓它盡可能開放,沒有現成的。
sum = 0
for i in range(len(res1)):
for j in range(len(res2[i])):
for i1 in range(len(res2)):
for j1 in range(len(res1[i1])):
sum = res1[i][j]*res2[i1][j1]
uj5u.com熱心網友回復:
在我回答的第一部分中,我將解釋如何直接修復您的代碼。您的代碼幾乎是正確的,但在邏輯上包含一個大錯誤。在我回答的第二部分中,我將解釋如何使用numpy. numpy是處理數字陣列的標準 python 包。如果您正在處理大量數字,沒有理由不使用 numpy。
修復你的代碼
您的代碼使用 4 個嵌套for回圈,使用索引i和j迭代第一個陣列,以及索引i1和j1迭代第二個陣列。
因此,您將第一個陣列中的每個元素 res1[i][j] 與第二個陣列中的每個元素 res2[i1][j1] 相乘。這不是你想要的。您只想將第一個陣列中的每個元素res1[i][j]與第二個陣列中的相應元素相乘res2[i][j]:您應該對第一個和第二個陣列使用相同的索引。因此應該只有兩個嵌套for回圈。
s = 0
for i in range(len(res1)):
for j in range(len(res1[i])):
s = res1[i][j] * res2[i][j]
請注意,我呼叫了變數s而不是sum. 這是因為sum是 python 中內置函式的名稱。強烈建議不要使用內置函式的名稱。這是內置串列:https ://docs.python.org/3/library/functions.html ;不要使用該串列中的名稱命名變數。
現在,一般來說,在 python 中,我們不喜歡range(len(...))在 for 回圈中使用。如果您閱讀官方教程及其關于forloops的部分,它建議for-loop 可用于直接迭代元素,而不是索引。
例如,這里是如何在一個陣列上迭代,對陣列中的元素求和,而不使用range(len(...))和不使用索引:
# sum the elements in an array
s = 0
for row in res1:
for x in row:
s = x
這row是一整行,并且x是一個元素。我們根本不提到指數。
有用的工具looping是內置函式zip和enumerate:
enumerate如果您需要訪問元素及其索引,則可以使用;zip可用于同時迭代兩個陣列。
我不會展示一個帶有 的示例enumerate,但這zip正是您需要的,因為您想在兩個陣列上進行迭代:
s = 0
for row1, row2 in zip(res1, res2):
for x, y in zip(row1, row2):
s = x * y
您也可以使用內置函式sum來撰寫這一切,而無需 =和不帶初始= 0:
s = sum(x * y for row1,row2 in zip(res1, res2) for x,y in zip(row1, row2))
使用numpy
正如我在介紹中提到的,numpy是處理數字陣列的標準 python 包。一般來說,使用 numpy 對陣列的操作比核心 python 中的陣列回圈快得多。另外,使用 numpy 的代碼通常比僅使用核心 python 的代碼更容易閱讀,因為有很多有用的函式和方便的符號。例如,這是實作您想要的簡單方法:
import numpy as np
# convert to numpy arrays
res1 = np.array(res1)
res2 = np.array(res2)
# multiply elements with corresponding elements, then sum
s = (res1 * res2).sum()
相關檔案:
- 總和:
.sum()或np.sum(); - 逐點乘法:
np.multiply()或*; - 點積:
np.dot.
uj5u.com熱心網友回復:
解決方案1:
import numpy as np
a,b = np.array(range(100)), np.array(range(100))
print((a * b).sum())
解決方案2(更開放,因為使用pd.DataFrame):
import pandas as pd
import numpy as np
a,b = np.array(range(100)), np.array(range(100))
df = pd.DataFrame(dict({'col1': a, 'col2': b}))
df['vect_product'] = df.col1 * df.col2
print(df['vect_product'].sum())
uj5u.com熱心網友回復:
使用 numpy 的兩個簡單快速的選項是:(A*B).sum()和np.dot(A.ravel(),B.ravel()). A第一種方法將和的元素乘法的所有元素相加B。np.sum()默認為sum(axis=None),所以我們會得到一個數字。在第二種方法中,您在兩個矩陣中創建一維視圖,然后應用點積方法得到一個數字。
import numpy as np
A = np.random.rand(1000,1000)
B = np.random.rand(1000,1000)
s = (A*B).sum() # method 1
s = np.dot(A.ravel(),B.ravel()) # method 2
第二種方法應該非常快,因為它不會創建新副本,A而是創建B它們的視圖,因此沒有額外的記憶體分配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480075.html
上一篇:填補角度串列(數字)之間的空白
下一篇:從面法線檢索物件旋轉
