Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数组的行连接成一维数组的高效算法方法_Python_Arrays_Algorithm_Numpy - Fatal编程技术网

Python 将数组的行连接成一维数组的高效算法方法

Python 将数组的行连接成一维数组的高效算法方法,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将给定的每个数组转换为一维数组。(对于我们上面的例子,这

我正在使用Numpy处理一些非常奇怪的表格数据。数据条目总是以每列1200个条目的形式出现

但是,行数总是不同的。有时我导入的表有12行(即numpy
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)