【发布时间】:2019-07-21 06:17:18
【问题描述】:
我有一个 numpy 数组,想对 ndarray 中每个元素的前两个数组进行子集化。
这是一个示例数组:
import numpy as np
a1 = np.array([[ 1, 2, 3],
[ 4, 5, 6]])
a2 = np.array([[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
a3 = np.array([[19, 20, 21],
[22, 23, 24],
[25, 26, 27]])
A = np.array([a1, a2, a3])
print("A =\n", A)
哪些打印:
A =
[array([[ 1, 2, 3],
[ 4, 5, 6]])
array([[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
array([[19, 20, 21],
[22, 23, 24],
[25, 26, 27]])]
想要的结果如下:
A =
[array([[ 1, 2, 3],
[ 4, 5, 6]])
array([[ 7, 8, 9],
[10, 11, 12]])
array([[19, 20, 21],
[22, 23, 24]])]
要打印等效对象,您可以这样做
print(np.array([a1[0:2], a2[0:2], a3[0:2]]))
但我想直接用 A 得到想要的东西。
在 numpy 中这样做的正确方法是什么?
编辑:我想在不循环的情况下对数组进行子集化。构造数组以便可以直接索引它们的替代方法也可以。任何避免循环的 numpy 函数都是公平的游戏。
【问题讨论】:
-
这对我来说没有意义。您基本上有 3 个不同大小的 ndarray。然后将它们放入一个大小为 3 的单个 ndarray。您如何期望在不单独索引它们的情况下对它们进行切片?
-
是否有另一种方法来构造数组?理想情况下,它们可以在没有循环的情况下实现子集化。
-
对
A(对象dtype数组)进行操作与对列表[a1,a2,a3]进行操作基本相同。两者都包含指向 3 个数组的指针。事实上,在列表上循环更快。没有索引A的子数组的“无循环”方法。现在,如果子数组都具有相同的形状,A将是 (3,3,3) 形状,您可以在中间维度上对A[:, 0:2, :]进行切片。 -
hpaulj 的回答最接近我的要求。但是将它们全部填充似乎是一项昂贵的成本——使第二维成为 a1、a2 或 a3 的最大长度,只是为了能够索引到最小的长度。