由2Dimensional np.array声明4Dimensional np.array

时间:2017-05-09 05:19:06

标签: python arrays numpy

我该如何设置:

d[i, j, i] = s[i, j] - s[i]

d是4维np.arrays是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

1 个答案:

答案 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)