块意味着numpy二维数组
我想在NumPy中查找二维数组的块平均值。 为了简单起见,让我们假设数组如下所示:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
我想把这个数组分成3个大小为2x4的块,然后找出所有三个块的平均值(这样平均值的形状就是2x4。第一个块由前4列组成,下一个由下一个块组成4栏等等,所以我的块是:
array([[0, 1, 2, 3],
[12, 13, 14, 15]])
array([[ 4, 5, 6, 7],
[16, 17, 18, 19]])
array([[ 8, 9, 10, 11],
[20, 21, 22, 23]])
我可以使用一个循环来做到这一点,但我觉得首先通过reshape
将该数组转换为3D数组,然后在第三个轴上使用三维数组上的mean
方法会更好。 这可能类似于这个问题。
如果有人能够提供给我:
1)。 如果存在这样的窍门,则适当的Pythonic命令执行该块意味着甚至不转换为3D。
2)。 如果没有适当的Pythonic命令来进行2D到3D的转换。
3)。 了解是否使用循环或使用上面的命令更有效(空间方面)。
Numpy方法几乎总是打败python循环,所以我会跳过你的1。
至于2,在这个特殊情况下,以下工作:
a = np.array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
a = a.reshape(2, 3, 4)
>>> a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>> np.mean(a, axis=1)
array([[ 4., 5., 6., 7.],
[ 16., 17., 18., 19.]])
诀窍在于reshape
。 对于需要n
列的块的一般情况,以下是一个选项
a = a.reshape((a.shape[0], -1, n))
你在3中的担心大多是没有根据的。 reshape
返回原始数组的视图,而不是副本,因此转换为3D只需要更改数组的shape
并strides
数组的属性,而无需复制任何实际数据。
编辑为了确保重塑不复制数组,但返回一个视图,做重塑
a.shape = a = a.reshape((a.shape[0], -1, n))
文档中的示例遵循以下内容:
>>> a = np.arange(12).reshape(3,4)
>>> b = a.T
>>> b.shape = (12,)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: incompatible shape for a non-contiguous array
一般来说,如果您在阵列上进行过transpose
, rollaxis
, swapaxes
或类似rollaxis
, swapaxes
只会有问题。
我可以回答你的号码1)。
vstack([mean(a[:,4*i:4*(i+1)],axis=1) for i in range(3)]).T
链接地址: http://www.djcxy.com/p/11679.html
上一篇: Block mean of numpy 2D array
下一篇: Using the Google APIs with OAuth 2.0 for gmail login in iPhone