【问题标题】:numpy array dimension mismatch errornumpy 数组维度不匹配错误
【发布时间】:2016-03-24 15:09:55
【问题描述】:

总的来说,我对 numpy 和 python 还是很陌生。即使我已确保两个数组具有相同的维度,当我尝试附加值时,仍会出现维度不匹配错误。我还有一个问题是为什么 numpy 在从制表符分隔的文本文件中读取数据时会创建一维数组。

import numpy as np

names = ["Angle", "RX_Power", "Frequency"]
data = np.array([0,0,0],float)  #experimental

data = np.genfromtxt("rx_power_mode 0.txt", dtype=float, delimiter='\t', names = names, usecols=[0,1,2], skip_header=1)

freq_177 = np.zeros(shape=(data.shape))

print(freq_177.shape)  #outputs(315,)

for i in range(len(data)):

    if data[i][2] == 177:
        #np.concatenate(freq_177,data[i]) has same issue
        np.append(freq_177,data[i],0) 

我得到的输出是

所有输入数组的维数必须相同

【问题讨论】:

  • 你能输出数据的形状吗?如果您的数据与 freq_177 的形状相同,则您应该无法索引第二个维度
  • 数据形状为 (315,) data[i] is (0.0, -86.0, 177.0) at i = 0
  • 我认为这是由于 getfromtxt 导致的,因为我尝试将数据声明为多维

标签: python arrays numpy append text-files


【解决方案1】:

注释代码:

import numpy as np

names = ["Angle", "RX_Power", "Frequency"]

您不需要“初始化”数组 - 除非您要为单个元素分配值。

data = np.array([0,0,0],float)  #experimental

这个data 分配完全覆盖了前一个。

data = np.genfromtxt("rx_power_mode 0.txt", dtype=float, delimiter='\t', names = names, usecols=[0,1,2], skip_header=1)

此时查看datadata.shape 是什么? data.dtype 是什么?打印它,或者至少打印一些元素。对于names,我猜这是一个一维数组,有一个3 字段dtype。不过,它不是一个二维数组,它可以转换/查看所有浮点数。

你为什么要制作一维零数组?

freq_177 = np.zeros(shape=(data.shape))
print(freq_177.shape)  #outputs(315,)

对于像data 这样的结构化数组,索引给定元素的首选方法是按字段名称和行号,例如。数据['频率'][i]`。玩那个。

np.append 与列表追加不同。它返回一个值;它不会原地更改freq_177concatenate 也一样。我建议远离np.append。太容易用错地方了。

for i in range(len(data)):
    if data[i][2] == 177:
        #np.concatenate(freq_177,data[i]) has same issue
        np.append(freq_177,data[i],0) 

您似乎想在freq_177 中收集data 数组中“频率”字段为177 的所有项。

I = data['frequency'].astype(int)==177
freq_177 = data[I]

我使用了astype(int),因为带有浮点数的== 测试不确定。它最好与整数一起使用。

I 是一个布尔掩码,值匹配时为真; data[I] 然后是data 的对应元素。 dtype 将匹配 data,即它将有 3 个字段。您不能将其附加或连接到浮点零数组(您原来的 freq_177)。

如果你必须迭代和收集值,我建议使用列表追加,例如

alist = []
for row in data:
   if int(row['frequency'])==177:
       alist.append(row)
freq177 = np.array(alist)

我认为np.append 的讨论不多,除了它自己的doc 页面和文本。它会定期出现在 SO 问题中。

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.append.html

返回:追加:ndarray

带有附加到轴的值的 arr 副本。请注意,追加不会就地发生:分配并填充一个新数组。

另见解释器外壳中的help(np.append)

对于genfromtxt - 它也有文档和大量的 SO 讨论。但要了解它在这种情况下返回的内容,您还需要阅读 structured arrayscompound dtype。 (添加链接?)

尝试加载数据:

data = np.genfromtxt("rx_power_mode 0.txt", dtype=float, delimiter='\t', usecols=[0,1,2], skip_header=1)

由于您正在跳过标题行,并且只使用带有浮点数的列,data 应该是一个包含 3 列的二维数组,(N, 3)。在这种情况下,您可以使用 data[:,2]

访问“频率”值
I = int(data[:,2])==177
freq_177 = data[I,:]

freq_177 现在是一个 3 列数组 - 包含 data 行的子集。

【讨论】:

  • 您好,感谢您的回复。这真的很好。我还有几个问题。首先我不确定为什么 genfromtxt 返回一个一维数组。其次,您能否指出一个很好的 numpy 参考。我在 Scipy.org 上查看函数 append 但它所说的只是它将值附加到数组的末尾。我自己不可能想出这个解决方案。
  • 我在文档中添加了一些注释。我还应该建议您如何加载数据以生成二维数组(假设都是数字)。
  • 啊,现在我明白了你是如何创建一个布尔数组并过滤掉结果的。因此,在浏览了 genfromtxt 的文档后,我看到它返回了一个 nd 数组。但奇怪的是,loadtxt 甚至返回了一个 ndarray。但是,如果我在示例文件上使用 loadtxt(因为我现在没有缺失值),它最终会返回一个二维数组。也许这与它处理数据的方式有关。无论如何,您的额外 cmets 非常有帮助。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 2017-12-31
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多