如何使用 2d 数组的值作为 numpy 中 3d 数组的索引?
How to use the value of a 2d array as an index to a 3d array in numpy?
我有一个二维数组 A,其形状为 (n x m),其中位置 (i,j) 处的数组的每个元素都包含第三个值 k。我想根据 2d 数组值和位置在位置 (k,i,j) 增加一个维度为 nxmxl 的 3d 数组。
例如如果
A = [[0,1],[3,3]] -> I would want B to be
[[[1,0],
[0,0]],
[0,1],
[0,0]],
[0,0],
[0,1]],
[0,0],
[0,2]]]
如何在 numpy 中高效地执行此操作?
问题有点模棱两可,但如果目的是在索引 (0,0,0)
、(1,0,1)
、(3,1,0)
和 [=17 处递增某个未知数组 B
=],那么下面的应该没问题:
B[(A.ravel(), ) + np.unravel_index(np.arange(np.prod(A.shape)), A.shape)] += increment
例如:
A = np.array([[0,1],[3,3]])
B = np.zeros((4,2,2), dtype=int)
increment = 1
B[(A.ravel(), ) + np.unravel_index(np.arange(np.prod(A.shape)), A.shape)] += increment
>>> B
array([[[1, 0],
[0, 0]],
[[0, 1],
[0, 0]],
[[0, 0],
[0, 0]],
[[0, 0],
[1, 1]]])
做同样事情的另一种方法是:
w, h = A.shape
indices = (A.ravel(),) + tuple(np.mgrid[:w, :h].reshape(2, -1))
# then
B[indices] += increment
我可以生产你的B
:
In [208]: res = np.zeros((4,2,2),int)
In [209]: res.reshape(4,4)[np.arange(4), A.ravel()] = [1,1,1,2]
In [210]: res
Out[210]:
array([[[1, 0],
[0, 0]],
[[0, 1],
[0, 0]],
[[0, 0],
[0, 1]],
[[0, 0],
[0, 2]]])
我使用 reshape
因为 A
值看起来更像
的索引
In [211]: res.reshape(4,4)
Out[211]:
array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 2]])
我有一个二维数组 A,其形状为 (n x m),其中位置 (i,j) 处的数组的每个元素都包含第三个值 k。我想根据 2d 数组值和位置在位置 (k,i,j) 增加一个维度为 nxmxl 的 3d 数组。
例如如果
A = [[0,1],[3,3]] -> I would want B to be
[[[1,0],
[0,0]],
[0,1],
[0,0]],
[0,0],
[0,1]],
[0,0],
[0,2]]]
如何在 numpy 中高效地执行此操作?
问题有点模棱两可,但如果目的是在索引 (0,0,0)
、(1,0,1)
、(3,1,0)
和 [=17 处递增某个未知数组 B
=],那么下面的应该没问题:
B[(A.ravel(), ) + np.unravel_index(np.arange(np.prod(A.shape)), A.shape)] += increment
例如:
A = np.array([[0,1],[3,3]])
B = np.zeros((4,2,2), dtype=int)
increment = 1
B[(A.ravel(), ) + np.unravel_index(np.arange(np.prod(A.shape)), A.shape)] += increment
>>> B
array([[[1, 0],
[0, 0]],
[[0, 1],
[0, 0]],
[[0, 0],
[0, 0]],
[[0, 0],
[1, 1]]])
做同样事情的另一种方法是:
w, h = A.shape
indices = (A.ravel(),) + tuple(np.mgrid[:w, :h].reshape(2, -1))
# then
B[indices] += increment
我可以生产你的B
:
In [208]: res = np.zeros((4,2,2),int)
In [209]: res.reshape(4,4)[np.arange(4), A.ravel()] = [1,1,1,2]
In [210]: res
Out[210]:
array([[[1, 0],
[0, 0]],
[[0, 1],
[0, 0]],
[[0, 0],
[0, 1]],
[[0, 0],
[0, 2]]])
我使用 reshape
因为 A
值看起来更像
In [211]: res.reshape(4,4)
Out[211]:
array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 2]])