【问题标题】:Why is numpy.array() creating an array without the correct shape?为什么 numpy.array() 创建一个没有正确形状的数组?
【发布时间】:2020-01-06 20:04:16
【问题描述】:

我想 numpy.concatenate 我从两个不同的列表创建的两个 numpy.arrays。我应该注意到列表中的数据是不同的类型。

我创建了两个列表。我都创建了 numpy 数组。然后我尝试连接。我收到一条错误消息:“所有输入数组必须具有相同的维数”。

l1 = [1, ..., n]
l2 = [1, ..., n]

print(len(l1)) # returns n
print(len(l2)) # returns n

a1 = np.array(l1)
a2 = np.array(l2)

print(np.shape(a1)) # returns (1, n)
print(np.shape(a1.T) # returns (n, 1)
print(np.shape(a2)) # returns (n,)

try:
    data = np.concatenate((a1.T, a2), axis=1) # epic fail; computer laughs at me
except Exception as e:
    print(e)

我应该注意其中一个列表的数据由地图对象组成。不确定这是否是一个问题。但是变量 l1 本身就是一个列表。

【问题讨论】:

  • 我应该注意到原始代码是用 Python 2 编写的,它使用了 l2.append(map(float, data_point))。在查看了 Python 2 和 3 portingguide.readthedocs.io/en/latest/iterators.html 对 map() 行为的更改后,我按照链接中的说明更改了我的代码。在可能相关的更高级别函数中出现另一个错误。 (注意:我测试时数组的排名是一样的)
  • 检查dtypeshape。如果两个列表都只包含数字,那么形状应该是(n,)。我不知道你是如何得到(1,n) 的——这意味着多了一层[]map 确实需要在 Py2 和 3 之间进行调整。而concatenate 需要一致的维数。
  • 当我替换地图对象列表时,它似乎已经修复了。之前是:l2.append(map(float, data))。我将其切换为:l2.append([float(x) for x in data])。它修复了我遇到的上述错误和“数组中的索引过多”的错误。我还应该补充一点,python 脚本不是由我创建的,而是包含根据以前的输出结果看起来准确的输出图。根据我附加的链接,它说 map() 从 2.x 更改为 3.x。不知道为什么,但改变对我有用。

标签: python-3.x list numpy dimensions numpy-ndarray


【解决方案1】:

我认为问题的一部分可能是两个数组具有不同的 numpy 等级,即len(a1.shape)==2len(a2.shape)==1。您可以使用np.newaxis 或只是None 添加一个虚拟轴。例如,以下似乎有效

import numpy as np
l1 = [[1,2,3,4]]
l2 = ['a','b','c','d']
a1 = np.array(l1)
a2 = np.array(l2)
print(a1.T.shape)
print(a2[:,None].shape)
data = np.hstack((a1.T, a2[:,None]))
print(data)

产生输出

$ python3 demo.py                                                               
(4, 1)
(4, 1)
[['1' 'a']
 ['2' 'b']
 ['3' 'c']
 ['4' 'd']]

当然,numpy 数组需要同构数据类型(可以是object)和concatenate,朋友们可能会以可能不喜欢的方式进行转换。

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多