从数组中提取矩阵数组的最合适方法
Most appropriate way to extract a array of matrices from an array
numpy 的新用户。我有一个问题,我没有找到不涉及原始循环的解决方案。
我有一个大小为 N * M 的一维数组。每个大小为 M 的块都由一个平面矩阵和一些附加值组成。我想提取这些矩阵。
例如,让我们考虑以下形式的一维数组:
[a1 b1 c1 d1 e1 f1 g1 a2 b2 c2 d2 e2 f2 g2 .... aN bN cN dN eN fN gN]
构建以下 N 2*2 矩阵数组的最优雅and/or有效方法是什么:
[[[a1,b1],
[c1,d1]],
[[a2,b2],
[c2,d2]],
....
[[aN,bN],
[cN,dN]]]
请注意,e1 f1 g1 已被丢弃。
作为具体示例,请考虑:
import numpy as np
x = np.array([0,1,2,3,-1,-1,-1
0,1,2,3,-1,-1,-1])
预期结果应为包含两个矩阵的数组 [[0,1],[2,3]]
重塑后跟切片的简单示例:
In [219]: x = np.arange(6)
In [220]: np.reshape(x,(2,3))
Out[220]:
array([[0, 1, 2],
[3, 4, 5]])
In [221]: np.reshape(x,(2,3))[:,:2]
Out[221]:
array([[0, 1],
[3, 4]])
一个解决方案似乎使用 as_strided
函数。
令b
为块大小,以下工作:
y = np.lib.stride_tricks.as_strided(x, shape=(x.size // b,2,2),
strides=(x.strides[0]*b,
x.strides[0]*2,
x.strides[0]))
例如:
>>> import numpy as np
>>> x = np.array([0,1,2,3,-1,-1,-1,
... 0,1,2,3,-1,-1,-1,
... 0,1,2,3,-1,-1,-1])
>>> b = 7
>>> y = np.lib.stride_tricks.as_strided(x, shape=(x.size // b,2,2),
... strides=(x.strides[0]*b,
... x.strides[0]*2,
... x.strides[0]))
>>> print(y)
[[[0 1]
[2 3]]
[[0 1]
[2 3]]
[[0 1]
[2 3]]]
如果谁有更好的解决办法,请告诉我;
感谢 hpaulj 花时间提供帮助。
numpy 的新用户。我有一个问题,我没有找到不涉及原始循环的解决方案。
我有一个大小为 N * M 的一维数组。每个大小为 M 的块都由一个平面矩阵和一些附加值组成。我想提取这些矩阵。
例如,让我们考虑以下形式的一维数组:
[a1 b1 c1 d1 e1 f1 g1 a2 b2 c2 d2 e2 f2 g2 .... aN bN cN dN eN fN gN]
构建以下 N 2*2 矩阵数组的最优雅and/or有效方法是什么:
[[[a1,b1],
[c1,d1]],
[[a2,b2],
[c2,d2]],
....
[[aN,bN],
[cN,dN]]]
请注意,e1 f1 g1 已被丢弃。
作为具体示例,请考虑:
import numpy as np
x = np.array([0,1,2,3,-1,-1,-1
0,1,2,3,-1,-1,-1])
预期结果应为包含两个矩阵的数组 [[0,1],[2,3]]
重塑后跟切片的简单示例:
In [219]: x = np.arange(6)
In [220]: np.reshape(x,(2,3))
Out[220]:
array([[0, 1, 2],
[3, 4, 5]])
In [221]: np.reshape(x,(2,3))[:,:2]
Out[221]:
array([[0, 1],
[3, 4]])
一个解决方案似乎使用 as_strided
函数。
令b
为块大小,以下工作:
y = np.lib.stride_tricks.as_strided(x, shape=(x.size // b,2,2),
strides=(x.strides[0]*b,
x.strides[0]*2,
x.strides[0]))
例如:
>>> import numpy as np
>>> x = np.array([0,1,2,3,-1,-1,-1,
... 0,1,2,3,-1,-1,-1,
... 0,1,2,3,-1,-1,-1])
>>> b = 7
>>> y = np.lib.stride_tricks.as_strided(x, shape=(x.size // b,2,2),
... strides=(x.strides[0]*b,
... x.strides[0]*2,
... x.strides[0]))
>>> print(y)
[[[0 1]
[2 3]]
[[0 1]
[2 3]]
[[0 1]
[2 3]]]
如果谁有更好的解决办法,请告诉我; 感谢 hpaulj 花时间提供帮助。