Python 用相应索引的元组替换多维数组的每个元素
在numpy中,假设我有一个数组Python 用相应索引的元组替换多维数组的每个元素,python,arrays,python-3.x,numpy,Python,Arrays,Python 3.x,Numpy,在numpy中,假设我有一个数组k,它具有形状(2,3,2,2) 如何创建形状为(2,3,2,2)的新数组j,使j的每个元素都是k中相应值的索引 第一个维度的第一个元素和第二个维度的第一个元素中的示例。(对应于 [[[[-0.08759809, -0.10987781], [-0.18387192, -0.2109216 ]], ) 。。。。依此类推。使用的方法如下: j = np.fromiter(np.ndindex(k.shape), dtype='i4,'*k.ndim).res
k
,它具有形状(2,3,2,2)
如何创建形状为(2,3,2,2)的新数组j
,使j
的每个元素都是k
中相应值的索引
第一个维度的第一个元素和第二个维度的第一个元素中的示例。(对应于
[[[[-0.08759809, -0.10987781],
[-0.18387192, -0.2109216 ]],
)
。。。。依此类推。使用的方法如下:
j = np.fromiter(np.ndindex(k.shape), dtype='i4,'*k.ndim).reshape(k.shape)
结果:
array([[[[(0, 0, 0, 0), (0, 0, 0, 1)],
[(0, 0, 1, 0), (0, 0, 1, 1)]],
[[(0, 1, 0, 0), (0, 1, 0, 1)],
[(0, 1, 1, 0), (0, 1, 1, 1)]],
[[(0, 2, 0, 0), (0, 2, 0, 1)],
[(0, 2, 1, 0), (0, 2, 1, 1)]]],
[[[(1, 0, 0, 0), (1, 0, 0, 1)],
[(1, 0, 1, 0), (1, 0, 1, 1)]],
[[(1, 1, 0, 0), (1, 1, 0, 1)],
[(1, 1, 1, 0), (1, 1, 1, 1)]],
[[(1, 2, 0, 0), (1, 2, 0, 1)],
[(1, 2, 1, 0), (1, 2, 1, 1)]]]],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4')])
数组([(0,0,0,0),(0,0,0,1)],
[(0, 0, 1, 0), (0, 0, 1, 1)]],
[[(0, 1, 0, 0), (0, 1, 0, 1)],
[(0, 1, 1, 0), (0, 1, 1, 1)]],
[[(0, 2, 0, 0), (0, 2, 0, 1)],
[(0, 2, 1, 0), (0, 2, 1, 1)]]],
[[[(1, 0, 0, 0), (1, 0, 0, 1)],
[(1, 0, 1, 0), (1, 0, 1, 1)]],
[[(1, 1, 0, 0), (1, 1, 0, 1)],
[(1, 1, 1, 0), (1, 1, 1, 1)]],
[[(1, 2, 0, 0), (1, 2, 0, 1)],
[(1, 2, 1, 0), (1, 2, 1, 1)]]]],
dtype=[('f0','一个简单的解决方案是迭代j,并用其索引j[idx,:]=idx
:
k=np.round(np.random.random((4,5)),2)
j=np.empty(k.shape+(k.ndim,))
对于np.ndindex(k形)中的idx:
j[idx,:]=idx
#数组([[0,0.],
# [0., 1.],
# [0., 2.],
# [0., 3.],
# [0., 4.]],
# [[1., 0.],
# [1., 1.],
# [1., 2.],
# [1., 3.],
# [1., 4.]],
# [[2., 0.],
# [2., 1.],
# [2., 2.],
# [2., 3.],
# [2., 4.]],
# [[3., 0.],
# [3., 1.],
# [3., 2.],
# [3., 3.],
# [3., 4.]]])
如果我们认为元组的长度为4的大小,而不是单个元素,那么它的大小将是(2, 3, 2,2, 4)。这能解决你的问题吗?如果是这样的话,请考虑接受/接受一个答案:+1谢谢你提醒我关于np.ndindex
,我完全忘记了它的存在,而是在我最初的回答中使用了np.ndenumerate
。
j = np.fromiter(np.ndindex(k.shape), dtype='i4,'*k.ndim).reshape(k.shape)
array([[[[(0, 0, 0, 0), (0, 0, 0, 1)],
[(0, 0, 1, 0), (0, 0, 1, 1)]],
[[(0, 1, 0, 0), (0, 1, 0, 1)],
[(0, 1, 1, 0), (0, 1, 1, 1)]],
[[(0, 2, 0, 0), (0, 2, 0, 1)],
[(0, 2, 1, 0), (0, 2, 1, 1)]]],
[[[(1, 0, 0, 0), (1, 0, 0, 1)],
[(1, 0, 1, 0), (1, 0, 1, 1)]],
[[(1, 1, 0, 0), (1, 1, 0, 1)],
[(1, 1, 1, 0), (1, 1, 1, 1)]],
[[(1, 2, 0, 0), (1, 2, 0, 1)],
[(1, 2, 1, 0), (1, 2, 1, 1)]]]],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4')])