Python 将数组的行连接成一维数组的高效算法方法
我正在使用Numpy处理一些非常奇怪的表格数据。数据条目总是以每列1200个条目的形式出现 但是,行数总是不同的。有时我导入的表有12行(即numpyPython 将数组的行连接成一维数组的高效算法方法,python,arrays,algorithm,numpy,Python,Arrays,Algorithm,Numpy,我正在使用Numpy处理一些非常奇怪的表格数据。数据条目总是以每列1200个条目的形式出现 但是,行数总是不同的。有时我导入的表有12行(即numpyndarray.shape=(121200),1200乘以12个总条目,即1200*12=14400)。有时表有6行(shape=(61200)),以此类推。这里没有模式 列数始终为1200,但行数始终不同。我不知道有多少行,所以我不能写一些数学公式 我想使用numpy.concatenate将给定的每个数组转换为一维数组。(对于我们上面的例子,这
ndarray.shape=(121200)
,1200乘以12个总条目,即1200*12=14400)。有时表有6行(shape=(61200)),以此类推。这里没有模式
列数始终为1200,但行数始终不同。我不知道有多少行,所以我不能写一些数学公式
我想使用numpy.concatenate
将给定的每个数组转换为一维数组。(对于我们上面的例子,这将是shape=(114400)。)
到目前为止,对于每个单独的数组,我必须单独将其分解为N个数组(N=未知的行数),然后单独连接它们
或者,为了编写for
语句,我必须找到行数,并为每个数组手动设置for语句
有没有更好的方法?这需要永远
编辑:对不起,把“行”和“列”混在一起了。为了反映这一点,我重新键入了上面的帖子。是的,阵列的形状一致(n,1200)。因此,格式为
(行、列)`且列一致为1200
进一步的问题:我关于
numpy.reformate
的问题是数据的顺序是否改变。那么,对于一个包含6行的数组,shape(61200)是否会返回一个数组形状(17200),以保持原始顺序?就是
newarray = array([row 1, row 2, row 3, row 4, row 5, row 6])
?解决您所问问题类型的两种方法是:
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,)
重塑
的优点是它不会复制数据,因此速度很快,但由于它只是旧数据的新视图,对a
的更改也会更改x
。当然,您也可以只复制重塑后的数组以获得单独的数据
concatenate
此处将创建一个副本,但请注意,复制的项目同样只是原始x
的视图,因此每个元素只有一个副本。使串联数组具有shape(172000)
对我来说似乎有点做作,所以我没有这样做,但如果这是您真正想要的,那么这当然是可能的
下面是一个示例,用于了解“重塑”中的排序工作原理:
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]]
因此,有几个数组的形状
(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(c,axis=0)
np.concatenate([c[0,:],c[1,:],c[2,:]...],axis=0)
展平后加入阵列如何:
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.flatte()
也会得到同样的结果。(展平
,拉威尔
,重塑
都做了基本相同的事情。)
concatenate
也可用于展平
数组,但这不是常用的方法。实际上,这与按行分割并连接这些行是相同的。请注意,np.vstack(c)
不是一回事。更直接地说,他说“行的数量总是不同的”和“行的数量始终是1200”。你的描述中似乎混合了行和列。数组的形状是否一致(n,1200)
?@hpaulji是的,数组的形状一致(n,1200)。因此,格式是
(行、列)`并且列始终是1200。我关于numpy.reformate的问题是数据的顺序是否改变。因此,对于一个有6行的数组,shape(61200)
,将numpy.reformate()
返回一个数组shape(172000)
,以便保留原始顺序?也就是说,arr=array([row 1,row 2,row 3,row 4,row 5,row 6])
?@JesseTrevve:我添加了一个示例,展示了重塑
的排序方式,我想这正是您想要的。(另外,如果您想要相反的行为,您可以先转置
,然后重塑
,所有这些都不复制实际数据。)挑剔:虽然在您显示的情况下,重塑
确实返回视图,但通常重塑
方法有时会复制数据,如果结果不能用视图表示。(示例:x=np.zeros((2,4))[:,:3];y=x.restrape(6)
)
np.concatenate(c,axis=0)
np.concatenate([c[0,:],c[1,:],c[2,:]...],axis=0)