首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将一维NumPy数组从(隐式)行的主要顺序更改为列的主要顺序

将一维NumPy数组从(隐式)行的主要顺序更改为列的主要顺序
EN

Stack Overflow用户
提问于 2014-10-29 01:45:20
回答 2查看 1.1K关注 0票数 3

我在NumPy中有一个一维数组,它以行的主要顺序隐式地表示一些2D数据。下面是一个简单的例子:

代码语言:javascript
复制
import numpy as np
# My data looks like [[1,2,3,4], [5,6,7,8]]
a = np.array([1,2,3,4,5,6,7,8])

我想得到一个一维数组按列-主要顺序(即。(以上示例中的b = [1,5,2,6,3,7,4,8] )。一般情况下,我只做以下几件事:

代码语言:javascript
复制
mat = np.reshape(a, (-1,4))
b = mat.flatten('F')

不幸的是,输入数组的长度不是我想要的行长的确切倍数(即。a = [1,2,3,4,5,6,7]),所以我不能给reshape打电话。不过,我希望保留这些额外的数据,因为我的行很长,这可能会非常多。在NumPy中有任何简单的方法来做到这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-29 02:15:49

使用一些值来表示null,使数组成为要拆分数组的倍数。如果可以接受对浮动的转换,则可以使用nan来表示表示空值的新增元素。然后重塑到2D,调用转置,然后重塑到1D。那就消除空白处。

代码语言:javascript
复制
import numpy as np
a = np.array([1,2,3,4,5,6,7]) # input
b = np.concatenate( (a, [np.NaN]) ) # add a NaN to make it 8 = 4x2
c = b.reshape(2,4).transpose().reshape(8,)  # reshape to 2x4, transpose, reshape to 8x1
d = c[-np.isnan(c)]  # remove NaN
print d

[ 1.  5.  2.  6.  3.  7.  4.]
票数 1
EN

Stack Overflow用户

发布于 2014-10-29 11:34:15

我能想到的最简单的方法不是尝试将reshape与诸如ravel('F')之类的方法一起使用,而是将数组的切片视图连接起来。

例如:

代码语言:javascript
复制
>>> cols = 4
>>> a = np.array([1,2,3,4,5,6,7])
>>> np.concatenate([a[i::cols] for i in range(cols)])
array([1, 5, 2, 6, 3, 7, 4])

这适用于任意长度的数组和任意数量的列:

代码语言:javascript
复制
>>> cols = 5
>>> b = np.arange(17)
>>> np.concatenate([b[i::cols] for i in range(cols)])
array([ 0,  5, 10, 15,  1,  6, 11, 16,  2,  7, 12,  3,  8, 13,  4,  9, 14])

或者,使用as_strided进行整形。数组a太小而不适合(2, 4)形状这一事实并不重要:最后您只会得到垃圾(即内存中的任何东西):

代码语言:javascript
复制
>>> np.lib.stride_tricks.as_strided(a, shape=(2, 4))
array([[        1,         2,         3,         4],
       [        5,         6,         7, 168430121]])

>>> _.flatten('F')[:7]
array([1, 5, 2, 6, 3, 7, 4])

在一般情况下,给定一个数组b和所需的列数cols,您可以这样做:

代码语言:javascript
复制
>>> x = np.lib.stride_tricks.as_strided(b, shape=(len(b)//cols + 1, cols)) # reshape to min 2d array needed to hold array b
>>> np.concatenate((x[:,:len(b)%cols].ravel('F'), x[:-1, len(b)%cols:].ravel('F')))

这将分解数组的“好”部分(那些不包含垃圾值的列)和坏的部分(除了位于底部行的垃圾值之外),并将两个已解出的数组连接起来。例如:

代码语言:javascript
复制
>>> cols = 5
>>> b = np.arange(17)
>>> x = np.lib.stride_tricks.as_strided(b, shape=(len(b)//cols + 1, cols))
>>> np.concatenate((x[:,:len(b)%cols].ravel('F'), x[:-1, len(b)%cols:].ravel('F')))
array([ 0,  5, 10, 15,  1,  6, 11, 16,  2,  7, 12,  3,  8, 13,  4,  9, 14])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26621524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档