我正在寻找一种方法来获得一个numpyndarray
的非琐碎的,特别是非连续的视图。你知道吗
例如,给定一个一维数组x = np.array([1, 2, 3, 4])
,有没有一种方法可以得到一个非平凡的视图,例如np.array([2, 4, 3, 1])
?你知道吗
问题的上下文如下:我有一个形状(U, V, S, T)
的4D数组,我想以一种非平凡的方式将其重塑为形状(U*S, V*T)
的2D数组,即一个简单的np.reshape()
不起作用,因为我想到了一个更复杂的索引方案,在这个方案中,重塑后的数组在内存中不会是连续的。我的例子中的数组相当大,我希望得到一个视图,而不是数组的副本。你知道吗
给定形状为(2, 2, 2, 2)
的数组x(u, v, s, t)
:
x = np.array([[[[1, 1], [1, 1]],[[2, 2], [2, 2]]],
[[[3, 3], [3, 3]], [[4, 4], [4, 4]]]])
我想获得数组的视图z(a, b)
:
np.array([[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]])
这对应于a = u * S + s
和b = v * T + t
的索引方案,在本例中S = 2 = T
。你知道吗
使用np.reshape
甚至as_strided
的各种方法。执行标准重塑不会改变元素在内存中出现的顺序。我试着玩order='F'
和转置一点,但不知道哪个给了我正确的结果。
因为我知道索引方案,所以我尝试使用np.ravel()
操作数组的扁平视图。我的想法是按照所需的索引方案创建一个索引数组,并将其应用于展平的数组视图,但不幸的是,fancy/advanced indexing提供了数组的副本,而不是视图。
有没有什么方法可以实现我正在寻找的索引视图?你知道吗
原则上,我认为这应该是可能的,例如ndarray.sort()
执行数组的就地非平凡索引。另一方面,这可能是在C/C++中实现的,所以在纯Python中甚至可能不可能实现。你知道吗
让我们回顾一下数组的基础知识—它有一个平面数据缓冲区、一个
shape
、strides
和dtype
。这三个属性用于以特定的方式view
数据缓冲区的元素,无论它是简单的一维序列、二维序列还是更高维序列。你知道吗一个真正的
view
不是使用相同的数据缓冲区,而是对其应用不同的形状、步长或数据类型。你知道吗要从
[1,2,3,4]
获取[2, 4, 3, 1]
,需要从2
开始,向前跳2,然后跳回到1,再向前跳2。这不是可以用strides
表示的规则模式。你知道吗arr[1::2]
给出[2,4],而arr[0::2]
给出[1,3]
。你知道吗(U, V, S, T)
到(U*S, V*T)
需要到(U, S, V, T)
的转置,然后是重塑那需要一份拷贝,没办法。你知道吗
或者用你的
x
请注意,元素的顺序不同:
ndarray.sort
就位并更改数据缓冲区中字节的顺序。它的运行水平很低,我们无法访问。它不是原始数组的view
。你知道吗相关问题 更多 >
编程相关推荐