【问题标题】:efficient algorithmic method to concatenate rows of an array into a 1-D array将数组的行连接成一维数组的有效算法方法
【发布时间】:2015-05-03 17:19:00
【问题描述】:

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

但是,行数总是变化的。有时我导入的表有 12 行(即 numpy ndarray.shape = (12, 1200),总条目数为 1200 乘以 12,即 1200*12 = 14400。)有时表有 6 行(形状 = (6, 1200)),依此类推.这里没有模式。

列数始终为 1200,但行数始终变化。我不知道有多少行,所以我不能写出某种数学公式。

我想使用numpy.concatenate 将我给定的每个数组放入一维ndarray。 (对于我们上面的示例,这将是 shape = (1, 14400)。)

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

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

有更好的方法的想法吗?这需要永远。

编辑:抱歉,将“行”和“列”混合在一起。我重新输入了上面的帖子以反映这一点。是的,数组的形状始终为(n, 1200). So, the format is(rows, columns)`,并且列始终为 1200。

进一步的问题:我关于numpy.reshape 的问题是数据的顺序是否改变了。那么,对于一个有 6 行,形状 (6, 1200) 的数组,numpy.reshape() 是否会返回一个数组形状 (1, 72000) 以保留原始顺序?也就是说,

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

?

【问题讨论】:

  • 更直接地说,他说“行数总是变化”“行数始终是1200”
  • 您的描述中似乎混合了行和列。数组的形状是否一致 (n,1200)
  • @hpaulji 是的,数组的形状一致为(n, 1200). So, the format is (rows, columns)`,列一致为 1200。

标签: python arrays algorithm numpy


【解决方案1】:

解决您所问问题类型的几种方法是:

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 的视图,因此每个元素只有一个副本。使串联数组具有(1, 72000) 的形状对我来说似乎有点做作,所以我没有这样做,但如果这是你真正想要的,那当然是可能的。

下面是一个示例,用于了解 reshape 中的排序如何工作:

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]]

【讨论】:

  • 我对@9​​87654329@的问题是数据的顺序是否改变了。那么,对于一个有 6 行的数组,形状为 (6, 1200)numpy.reshape() 是否会返回一个数组形状 (1, 72000),从而保留原始顺序?即arr = array([row 1, row 2, row 3, row 4, row 5, row 6])?
  • @JesseTrevve:我添加了一个示例,展示了reshape 的排序方式,我认为这正是您想要的。 (另外,如果你想要相反的行为,你可以先transpose 然后reshape,所有这些都不需要复制实际数据。)
  • Nitpick:尽管在您展示的情况下,reshape 确实返回了一个视图,但通常reshape 方法确实有时会复制数据,如果结果可以' t 用视图来表示。 (例如:x = np.zeros((2, 4))[:, :3]; y = x.reshape(6)。)
【解决方案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) 不是一回事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多