我该如何设置:
d[i, j, i] = s[i, j] - s[i]
d
是4维np.array
,s
是2维np.array
使用NumPy而不使用for循环?
我尝试了以下内容:
d = np.zeros([10, 10, 10, 10])
s = np.ones([10, 10])
l1 = range(M)
l2 = range(N)
d[np.ix_(l1, l2, l1)] = s[np.ix_(l1, l2)] - s[np.ix_(l1)]
但它不能按我的意愿工作。
d[i, j, k] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
但我想要
d[i, j, k] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
if i != k
答案 0 :(得分:0)
给予i和j不同的范围以更好地区分维度:
迭代解决方案:
git checkout dev
git rebase master
阵列解决方案:
In [271]: d = np.zeros((3,4,3,4),int)
In [272]: s = np.arange(12).reshape(3,4)
In [273]: for i in range(3):
...: for j in range(4):
...: d[i,j,i,:] = s[i,j]-s[i,:]
检查
In [274]: d1 = np.zeros((3,4,3,4),int)
In [281]: l1=np.arange(3)
In [283]: d1[l1,:,l1,:] = (s[:,:,None]-s[:,None,:])
和
In [284]: np.allclose(d,d1)
Out[284]: True
如果In [285]: d[0,1,0,:]
Out[285]: array([ 1, 0, -1, -2])
In [286]: d[0,1,2,:]
Out[286]: array([0, 0, 0, 0])
In [287]: d1[0,1,0,:]
Out[287]: array([ 1, 0, -1, -2])
In [288]: d1[0,1,1,:]
Out[288]: array([0, 0, 0, 0])
In [289]: d1[1,2,2,:]
Out[289]: array([0, 0, 0, 0])
In [290]: d1[2,2,2,:]
Out[290]: array([ 2, 1, 0, -1])
,则所有值的s = np.ones((3,4))
为d
。
0
此索引的变体:
In [302]: d1[l1,:,l1,:].shape
Out[302]: (3, 4, 4)
In [303]: (s[:,:,None]-s[:,None,:]).shape
Out[303]: (3, 4, 4)
上一个问题的解决方案是
In [318]: I,J=np.ix_(l1,l2)
In [319]: I
Out[319]:
array([[0],
[1],
[2]])
In [320]: J
Out[320]: array([[0, 1, 2, 3]])
In [321]: d1[I,J,I,:].shape
Out[321]: (3, 4, 4)