我在NumPy中有一个一维数组,它以行的主要顺序隐式地表示一些2D数据。下面是一个简单的例子:
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] )。一般情况下,我只做以下几件事:
mat = np.reshape(a, (-1,4))
b = mat.flatten('F')不幸的是,输入数组的长度不是我想要的行长的确切倍数(即。a = [1,2,3,4,5,6,7]),所以我不能给reshape打电话。不过,我希望保留这些额外的数据,因为我的行很长,这可能会非常多。在NumPy中有任何简单的方法来做到这一点吗?
发布于 2014-10-29 02:15:49
使用一些值来表示null,使数组成为要拆分数组的倍数。如果可以接受对浮动的转换,则可以使用nan来表示表示空值的新增元素。然后重塑到2D,调用转置,然后重塑到1D。那就消除空白处。
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.]发布于 2014-10-29 11:34:15
我能想到的最简单的方法不是尝试将reshape与诸如ravel('F')之类的方法一起使用,而是将数组的切片视图连接起来。
例如:
>>> 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])这适用于任意长度的数组和任意数量的列:
>>> 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)形状这一事实并不重要:最后您只会得到垃圾(即内存中的任何东西):
>>> 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,您可以这样做:
>>> 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')))这将分解数组的“好”部分(那些不包含垃圾值的列)和坏的部分(除了位于底部行的垃圾值之外),并将两个已解出的数组连接起来。例如:
>>> 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])https://stackoverflow.com/questions/26621524
复制相似问题