一种高效的一维数组行拼接算法

2024-04-24 11:55:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Numpy来处理一些非常奇怪的表格数据。数据项总是以每列1200个条目的形式出现。你知道吗

但是,行数总是不同的。有时我导入的表有12行(即numpyndarray.shape = (12, 1200),1200乘以12个总条目,即1200*12=14400),有时表有6行(shape=(61200)),以此类推。这里没有模式。你知道吗

列数始终为1200,但行数始终不同。我事先不知道有多少行,所以我不能写一些数学公式。你知道吗

我想用numpy.concatenate把我得到的每个数组转换成一维数组。(对于我们上面的例子,那就是shape=(114400)。)你知道吗

到目前为止,对于每个单独的数组,我必须将它单独分解为N个数组(N=未知的行数),然后将它们单独连接起来。你知道吗

或者,为了编写for语句,我必须找到行数,并为每个数组手动设置for语句。你知道吗

有没有更好的方法?这需要很长时间。你知道吗

编辑:对不起,把“行”和“列”混在一起了。为了反映这一点,我重新打印了上面的帖子。是的,数组的形状始终是(n, 1200). So, the format is(行,列)`并且列的形状始终是1200。你知道吗

进一步的问题:我关于numpy.reshape的问题是数据的顺序是否改变了。因此,对于具有6行的数组,shape(61200)将numpy.重塑()返回数组形状(172000),以便保留原始顺序?也就是说

newarray = array([row 1, row 2, row 3, row 4, row 5, row 6])

什么?你知道吗


Tags: 数据目的numpyfor顺序数组语句形式
2条回答

所以有几个数组的形状是(n,1200)

做一些简单的样品。更容易看出发生了什么。你知道吗

a = np.arange(12).reshape(2,6)
#array([[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]])

注意数字是如何增加的

b = np.arange(18).reshape(3,6)
c = np.concatenate([a,b], axis=0)

生产

array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17]])

因为它只是第一个维度的变化,所以沿着这个维度连接是没有问题的。np.vstack做同样的事情。你知道吗

展平后加入阵列如何:

np.concatenate([a.flatten(),b.flatten()])
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,  0,  1,  2,  3,  4, 5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17])

c.flatten()你也会得到同样的结果。(flattenravelreshape都做了本质上相同的事情。)

np.concatenate(c,axis=0)
np.concatenate([c[0,:],c[1,:],c[2,:]...],axis=0)

concatenate也可以用来flatten数组,但这不是通常的方法。实际上,它与按行拆分并连接这些行是相同的。注意np.vstack(c)不是一回事。你知道吗

解决您所问问题的两种方法是:

import numpy as np

x = np.ones((6, 12000))

a = np.reshape(x, (1, -1))

b = np.concatenate([x[i,:] for i in range(x.shape[0])])

print x.shape     # (6, 12000)
print a.shape     # (1, 72000)
print b.shape     # (72000,)

reshape的优点是它不会复制数据,因此速度很快,但由于它只是旧数据的新视图,对a的更改也会更改x。当然,您也可以复制重塑后的数组以获得单独的数据。你知道吗

concatenate这里将创建一个副本,但是请注意,复制的项目同样只是原始x上的视图,因此每个元素只有一个副本。使串联数组具有shape(1, 72000)对我来说似乎有点做作,所以我没有这样做,但如果这是您真正想要的,那么这肯定是可能的。你知道吗

下面是一个示例,用于了解在重塑中如何进行排序:

x2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
c = np.reshape(x2, (1, -1))

print x2
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

print c
#  [[1 2 3 4 5 6 7 8 9]]

相关问题 更多 >