Numpy 索引广播引入了新的维度
Numpy indexing broadcasting introduces new dimension
我有一个要用于映射的数组。我们称它为 my_map
,输入 float shape (m,c).
我有第二个带索引的数组,以免称它为my_indexes
,类型为int size (n,c),每个值都在0到m之间。
尝试索引 my_map
做 my_ans = my_map[my_indexes]
我得到一个形状数组 (n,c,c),而我期望的是 (n,c)。正确的做法是什么?
明确一点,我要做的是等同于:
my_ans = np.empty_like(touch_probability)
for i in range(c):
my_ans[:,i] = my_map[:,i][my_indexes[:,i]]
为了说明和测试您的问题,请定义简单、真实的数组:
In [44]: arr = np.arange(12).reshape(3,4)
In [45]: idx = np.array([[0,2,1,0],[2,2,1,0]])
In [46]: arr.shape
Out[46]: (3, 4)
In [47]: idx.shape
Out[47]: (2, 4)
您想要的计算方式:
In [48]: res = np.zeros((2,4), int)
In [49]: for i in range(4):
...: res[:,i] = arr[:,i][idx[:,i]] # same as arr[idx[:,i], i]
...:
In [50]: res
Out[50]:
array([[0, 9, 6, 3],
[8, 9, 6, 3]])
用一个索引步骤做同样的事情:
In [51]: arr[idx, np.arange(4)]
Out[51]:
array([[0, 9, 6, 3],
[8, 9, 6, 3]])
这是将两个索引数组相互广播,然后选择点:
In [52]: np.broadcast_arrays(idx, np.arange(4))
Out[52]:
[array([[0, 2, 1, 0],
[2, 2, 1, 0]]),
array([[0, 1, 2, 3],
[0, 1, 2, 3]])]
所以我们用 2 个 (n,c) 数组索引 (m,c) 数组
以下相同:
arr[idx]
arr[idx, :]
它使用 idx
到 select 来自 arr
的整行,所以结果是 idx
的形状加上 arr
的最后一个维度。你想要的只是 idx[j,i]
行的 ith
元素。
我有一个要用于映射的数组。我们称它为 my_map
,输入 float shape (m,c).
我有第二个带索引的数组,以免称它为my_indexes
,类型为int size (n,c),每个值都在0到m之间。
尝试索引 my_map
做 my_ans = my_map[my_indexes]
我得到一个形状数组 (n,c,c),而我期望的是 (n,c)。正确的做法是什么?
明确一点,我要做的是等同于:
my_ans = np.empty_like(touch_probability)
for i in range(c):
my_ans[:,i] = my_map[:,i][my_indexes[:,i]]
为了说明和测试您的问题,请定义简单、真实的数组:
In [44]: arr = np.arange(12).reshape(3,4)
In [45]: idx = np.array([[0,2,1,0],[2,2,1,0]])
In [46]: arr.shape
Out[46]: (3, 4)
In [47]: idx.shape
Out[47]: (2, 4)
您想要的计算方式:
In [48]: res = np.zeros((2,4), int)
In [49]: for i in range(4):
...: res[:,i] = arr[:,i][idx[:,i]] # same as arr[idx[:,i], i]
...:
In [50]: res
Out[50]:
array([[0, 9, 6, 3],
[8, 9, 6, 3]])
用一个索引步骤做同样的事情:
In [51]: arr[idx, np.arange(4)]
Out[51]:
array([[0, 9, 6, 3],
[8, 9, 6, 3]])
这是将两个索引数组相互广播,然后选择点:
In [52]: np.broadcast_arrays(idx, np.arange(4))
Out[52]:
[array([[0, 2, 1, 0],
[2, 2, 1, 0]]),
array([[0, 1, 2, 3],
[0, 1, 2, 3]])]
所以我们用 2 个 (n,c) 数组索引 (m,c) 数组
以下相同:
arr[idx] arr[idx, :]
它使用 idx
到 select 来自 arr
的整行,所以结果是 idx
的形状加上 arr
的最后一个维度。你想要的只是 idx[j,i]
行的 ith
元素。