gpt4 book ai didi

python - 如何使用 numpy 将一维数组转换为二维数组?

转载 作者:太空宇宙 更新时间:2023-11-04 03:39:48 25 4
gpt4 key购买 nike

我有这样的数据:

>>>npfilled[:5]

array([('!', 0, 0, 3, 10, 0, 2, 4, 4), ('!"', 0, 0, 0, 5, 0, 0, 0, 0),
('"', 23, 13, 20, 32, 0, 0, 22, 9),
("'", 21, 8, 23, 12, 5, 10, 0, 7), ('(', 3, 2, 2, 3, 0, 0, 0, 0)],
dtype=[('token', '<U64'), ('mel_freq1', '<i2'), ('mel_freq0', '<i2'), ('mel_freq2', '<i2'), ('mel_freq3', '<i2'), ('aus_freq0', '<i2'), ('aus_freq1', '<i2'), ('aus_freq2', '<i2'), ('aus_freq3', '<i2')])

>>>npfilled.shape
(301,)

但我需要它是 (301,2),这样我就可以对其进行切片并对其进行其他分析,目前我还做不到。我怎样才能做到这一点?

最佳答案

用 numpy 术语来说,您是在询问如何将结构化数组转换为“普通”二维数组,其中结构中的每个项目都沿着一个新轴。

顺便说一句,对于像这样的异构数据,pandas 可能更适合您。

话虽如此,这里有一个简单的解释:


首先,要从您当前的结构化数组中切分列,您需要执行如下操作:

import numpy as np

# Your example data...
data = np.array([('!', 0, 0, 3, 10, 0, 2, 4, 4),
('!"', 0, 0, 0, 5, 0, 0, 0, 0),
('"', 23, 13, 20, 32, 0, 0, 22, 9),
("'", 21, 8, 23, 12, 5, 10, 0, 7),
('(', 3, 2, 2, 3, 0, 0, 0, 0)],
dtype=[('token', '<U64'), ('mel_freq1', '<i2'),
('mel_freq0', '<i2'), ('mel_freq2', '<i2'),
('mel_freq3', '<i2'), ('aus_freq0', '<i2'),
('aus_freq1', '<i2'), ('aus_freq2', '<i2'),
('aus_freq3', '<i2')])

# Print out two arbitrary columns.
print data[['token', 'aus_freq1']]

这会给出:

[(u'!', 2) (u'!"', 0) (u'"', 0) (u"'", 10) (u'(', 0)]

如果您有异构数据,您可能真的不想切换到“普通”数组。

但是,如果您确实想将其切换过来,您可能会想到以下内容:

array([[u'!', 0, 0, 3, 10, 0, 2, 4, 4],
[u'!"', 0, 0, 0, 5, 0, 0, 0, 0],
[u'"', 23, 13, 20, 32, 0, 0, 22, 9],
[u"'", 21, 8, 23, 12, 5, 10, 0, 7],
[u'(', 3, 2, 2, 3, 0, 0, 0, 0]], dtype=object)

简短的回答:


如果您不是特别关心内存使用情况,您可以这样做:

np.array(data.tolist(), dtype=object)

较长的答案:

上面这行代码很容易就能得到你想要的东西。但是,这种方法有两个小缺点。

  1. 构造一个中间列表,并且
  2. 返回一个对象数组,它的内存效率比原来的结构化数组低很多。

没有办法解决第二个问题。这就是结构化数组存在的原因。对象数组(指针数组)在内存中不像结构化数组那样紧凑,但它们可以容纳任意对象。

但是,如果只想获取原始结构化数组的同类部分,那么您可以执行类似的操作:

# Only the first column is text...
numeric_cols = list(data.dtype.names[1:])

# View the non-text parts as an array with the same dtype as the numeric cols:
data2d = data[numeric_cols].view('<i2')

# And reshape it into a 2D array:
data2d = data2d.reshape(-1, len(numeric_cols))

这会产生:

In [10]: data2d
Out[10]:
array([[ 0, 0, 3, 10, 0, 2, 4, 4],
[ 0, 0, 0, 5, 0, 0, 0, 0],
[23, 13, 20, 32, 0, 0, 22, 9],
[21, 8, 23, 12, 5, 10, 0, 7],
[ 3, 2, 2, 3, 0, 0, 0, 0]], dtype=int16)

这种方法比较冗长,但如果你有一个非常大的数组,它会快得多。

关于python - 如何使用 numpy 将一维数组转换为二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27030424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com