對于 rank-4 陣列,M[n0,n1,n2,n3]
我愿意
M[m0,m1,:,:]*(some operation)為所有人做m0,m1
或者M[:,m1,:,m3]*(some operation)對于所有m1,m3有一些操作的人
我可以
import numpy as np
import time
n0=2
n1=2
n2=2
n3=2
M = np.zeros((n0,n1,n2,n3))
M2 = np.zeros((n0,n1,n2,n3))
M3 = np.zeros((n0,n1,n2,n3))
i = 0
for m0 in range(M.shape[0]):
for m1 in range(M.shape[1]):
for m2 in range(M.shape[2]):
for m3 in range(M.shape[3]):
M[m0,m1,m2,m3] = i
i = i 1
input = 0
if input == 0:
for m0 in range(M.shape[0]):
for m1 in range(M.shape[1]):
M2[m0,m1,:,:] = M[m0,m1,:,:]*(m0 m1)
elif input == 1:
for m1 in range(M.shape[1]):
for m3 in range(M.shape[3]):
M2[:,m1,:,m3] = M[:,m1,:,m3]*(m1-m3)
for m0 in range(M2.shape[0]):
for m1 in range(M2.shape[1]):
for m2 in range(M2.shape[2]):
for m3 in range(M2.shape[3]):
# M2[m0,m1,m2,m3] = i
print(m0, m1, m2, m3, 'M', M[m0,m1,m2,m3], 'M2', M2[m0,m1,m2,m3])
(使用:跳過幾個回圈似乎比顯式回圈所有索引更快m0- m3。這就是這個問題的動機:利用:.m0 m1并且m1-m3以某種方式隨機選擇)
樣本輸出是
0 0 0 0 M 0.0 M2 0.0
0 0 0 1 M 1.0 M2 0.0
0 0 1 0 M 2.0 M2 0.0
0 0 1 1 M 3.0 M2 0.0
0 1 0 0 M 4.0 M2 4.0
0 1 0 1 M 5.0 M2 5.0
0 1 1 0 M 6.0 M2 6.0
0 1 1 1 M 7.0 M2 7.0
1 0 0 0 M 8.0 M2 8.0
1 0 0 1 M 9.0 M2 9.0
1 0 1 0 M 10.0 M2 10.0
1 0 1 1 M 11.0 M2 11.0
1 1 0 0 M 12.0 M2 24.0
1 1 0 1 M 13.0 M2 26.0
1 1 1 0 M 14.0 M2 28.0
1 1 1 1 M 15.0 M2 30.0
我的問題是,有沒有簡單的方法來實作上面的代碼,通過輸入目標陣列元素的位置,例如0,1,M[m0,m1,:.:]來實作代碼的上半部分(input = 0);1,3對于上述代碼M[:,m1,:,m3]的下部( )?input = 1并包括其他情況,例如,0,2;0,3;1,2;2,3。本質上,改變索引標簽的位置和:。
我可以讓python列印包含所有情況的代碼,但我希望有更簡單的東西
uj5u.com熱心網友回復:
我不知道你會需要什么復雜的操作,但現在,我想你對 numpy 計算并不熟悉。為此,我重寫了整個答案,以更簡單快捷的方式完成你的三個要求:
# Yours
n0 = n1 = n2 = n3 = 2
M = np.zeros((n0, n1, n2, n3))
M2 = np.zeros((n0, n1, n2, n3))
M3 = np.zeros((n0, n1, n2, n3))
i = 0
for m0 in range(M.shape[0]):
for m1 in range(M.shape[1]):
for m2 in range(M.shape[2]):
for m3 in range(M.shape[3]):
M[m0,m1,m2,m3] = i
i = i 1
for m0 in range(M.shape[0]):
for m1 in range(M.shape[1]):
M2[m0,m1,:,:] = M[m0,m1,:,:]*(m0 m1)
for m1 in range(M.shape[1]):
for m3 in range(M.shape[3]):
M3[:,m1,:,m3] = M[:,m1,:,m3]*(m1-m3)
# Mine
N = np.arange(n0 * n1 * n2 * n3, dtype=float).reshape(n0, n1, n2, n3)
m0, m1, m2, m3 = np.indices(N.shape, sparse=True)
N2 = N * (m0 m1)
N3 = N * (m1 - m3)
您可以使用等號和方法ndarray.all來確定兩個陣列是否完全相等:
print((M == N).all())
print((M2 == N2).all())
print((M3 == N3).all())
你可以自己試試,都是True。如果你想知道原理,我可以試著寫,但我現在沒有太多時間。
我還要提醒大家,在操作numpy陣列的時候,盡量避免使用回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464609.html
上一篇:如何在python中有效地重復矩陣中的二進制模式和比率?
下一篇:插入串列理解
