我可以使用数组作为索引对 numpy 数组进行切片吗?
Can I slice a numpy array using an array as indices?
我有 2 个 numpy 数组:
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = np.array([2, 1, 2])
我想使用 b
作为 a
列的起始索引,并将 a
从这些列索引开始的所有值设置为 0,如下所示:
np.array([[1, 2, 3],
[4, 0, 6],
[0, 0, 0]])
即,将第1列从位置2开始的元素设置为0,将第2列从位置1开始的元素设置为0,将第3列从位置2开始的元素设置为0。
当我尝试这个时:
a[:, b:] = 0
我明白了
TypeError: only integer scalar arrays can be converted to a scalar index
有没有一种方法可以在没有 for 循环的情况下使用索引数组进行切片?
编辑:更新示例以显示索引可以是任意的
我认为问题出在a[:,b:]
;如果 b
不是定标器,这里 b:
意义不大,例如5:
表示从第 6 位开始,但当数组为 2d 时 [1,2,3]:
没有任何意义。
应该是a[:,b]
。设置 a[:,b] = 0
会将 b
中指定的所有列设置为 0
。以下是运行.
In [2]: import numpy as np
In [3]: a = np.array([[1, 2, 3],
...: [4, 5, 6],
...: [7, 8, 9]])
...:
...: b = np.array([2, 1, 2])
...:
In [4]: a
Out[4]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [5]: b
Out[5]: array([2, 1, 2])
In [6]: b.dtype
Out[6]: dtype('int64')
In [7]: a[:, b:] = 0
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-6e5050513225> in <module>
----> 1 a[:, b:] = 0
TypeError: only integer scalar arrays can be converted to a scalar index
In [8]: a[:, b] = 0
In [9]: a
Out[9]:
array([[1, 0, 0],
[4, 0, 0],
[7, 0, 0]])
但这不是你想要的。
为了得到你想要的,你需要指定行索引和列索引,例如(1,1), (2,0), (2,1), (2,2)
.
In [11]: a[[1,2,2,2], [1, 0, 1,2]] = 0
In [12]: a
Out[12]:
array([[1, 2, 3],
[4, 0, 6],
[0, 0, 0]])
您可以使用 boolean array indexing。首先,创建一个要设置为 0 的索引掩码,然后将掩码应用于数组并分配替换值(例如,在您的情况下为 0)。
mask = b>np.arange(a.shape[1])[:,None]
a[~mask]=0
输出:
array([[1, 2, 3],
[4, 0, 6],
[0, 0, 0]])
我有 2 个 numpy 数组:
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = np.array([2, 1, 2])
我想使用 b
作为 a
列的起始索引,并将 a
从这些列索引开始的所有值设置为 0,如下所示:
np.array([[1, 2, 3],
[4, 0, 6],
[0, 0, 0]])
即,将第1列从位置2开始的元素设置为0,将第2列从位置1开始的元素设置为0,将第3列从位置2开始的元素设置为0。
当我尝试这个时:
a[:, b:] = 0
我明白了
TypeError: only integer scalar arrays can be converted to a scalar index
有没有一种方法可以在没有 for 循环的情况下使用索引数组进行切片?
编辑:更新示例以显示索引可以是任意的
我认为问题出在a[:,b:]
;如果 b
不是定标器,这里 b:
意义不大,例如5:
表示从第 6 位开始,但当数组为 2d 时 [1,2,3]:
没有任何意义。
应该是a[:,b]
。设置 a[:,b] = 0
会将 b
中指定的所有列设置为 0
。以下是运行.
In [2]: import numpy as np
In [3]: a = np.array([[1, 2, 3],
...: [4, 5, 6],
...: [7, 8, 9]])
...:
...: b = np.array([2, 1, 2])
...:
In [4]: a
Out[4]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [5]: b
Out[5]: array([2, 1, 2])
In [6]: b.dtype
Out[6]: dtype('int64')
In [7]: a[:, b:] = 0
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-6e5050513225> in <module>
----> 1 a[:, b:] = 0
TypeError: only integer scalar arrays can be converted to a scalar index
In [8]: a[:, b] = 0
In [9]: a
Out[9]:
array([[1, 0, 0],
[4, 0, 0],
[7, 0, 0]])
但这不是你想要的。
为了得到你想要的,你需要指定行索引和列索引,例如(1,1), (2,0), (2,1), (2,2)
.
In [11]: a[[1,2,2,2], [1, 0, 1,2]] = 0
In [12]: a
Out[12]:
array([[1, 2, 3],
[4, 0, 6],
[0, 0, 0]])
您可以使用 boolean array indexing。首先,创建一个要设置为 0 的索引掩码,然后将掩码应用于数组并分配替换值(例如,在您的情况下为 0)。
mask = b>np.arange(a.shape[1])[:,None]
a[~mask]=0
输出:
array([[1, 2, 3],
[4, 0, 6],
[0, 0, 0]])