我正在尝试访问NumPy数组的特定行和列,documentation解释但我认为我遗漏了一些内容。
我有以下数组:
arr = np.random.randint(10, size=(6, 4))
array([[1, 9, 6, 4],
[8, 5, 0, 3],
[3, 7, 3, 2],
[1, 4, 8, 0],
[5, 5, 8, 0],
[0, 6, 4, 9]])
我想得到第一排和最后一排;以及第一,第三和最后一栏,所以我正在尝试:
arr[(0, -1),(0, 1, 3)]
但这会产生以下错误:
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,)
我认为我误解了这种类型的整数索引。我希望这个输出:
array([[1, 9, 4],
[0, 6, 9]])
我可以这样做,但感觉真的很尴尬:
arr[(0,-1),:][:,(0,1,3)]
如何获得不同尺寸的第i个元素?
答案 0 :(得分:2)
您正在寻找np.ix_
:
arr[np.ix_((0, -1),(0, 1, 3))]
结果
array([[1, 9, 4],
[0, 6, 9]])
答案 1 :(得分:1)
一种方法是显式指定结果的每个元素的索引,其中关键区别在于行规范应为2d:
>>> np.random.seed(444)
>>> arr = np.random.randint(10, size=(6, 4))
>>> arr
array([[3, 0, 7, 8],
[3, 4, 7, 6],
[8, 9, 2, 2],
[2, 0, 3, 8],
[0, 6, 6, 0],
[3, 0, 6, 7]])
>>> rows = [[0],
... [-1]]
>>> cols = [0, 1, -1]
>>> arr[rows, cols]
array([[3, 0, 8],
[3, 0, 7]])
此示例利用行索引的广播。换句话说,除了第0列之外,您还可以利用除了剩下的两列之外的行重复这一事实。
要使用高级索引,需要明确选择所有元素。 ...但是,由于上面的索引数组只是重复自己,因此可以使用广播。您无法利用广播并需要指定每个索引的示例如下:
rows = [[1, 2],
[3, 4]]
cols = [[2, 3],
[1, 0]]
在这种情况下,您在(1,2),(2,3),......选择元素
请参阅文档中的this示例。
你可能会注意到这正是np.ix_
产生的结果(尽管我并不是说它不是一个有用的功能):
>>> rows, cols = np.ix_((0, -1),(0, 1, 3))