【问题标题】:convertion and triming of numpy array of lists to numpy array of numpy arrays problem将 numpy 列表数组转换和修剪为 numpy 数组 numpy 数组问题
【发布时间】:2020-08-02 01:55:06
【问题描述】:

嘿,我是 numpy 数组的新手,我想了解一个简短的代码,我尝试将 numpy 列表数组转换为 numpy 数组 numpy 数组,

a=np.array([[1,2,3],[3,2,3,4]])
for i in range(len(a)):
    if len(a[i])>3:
        a[i]=a[i][:3]
    a[i]=np.array(a[i])

现在我检查了 a 和 a[0] 和 a[1] 的类型,它们都是 numpy 数组。 然后 我打印了 a 的形状,它是 (2,) 而不是 (2,3),就像我预期的那样虽然 a[0] 和 a[1] 的长度是相同的,所以我想知道它为什么会发生,以及如何将变量 a 从一个 numpy 列表数组转换为一个 numpy 数组,例如形状为 (2,3),非常感谢您的帮助。

【问题讨论】:

  • 再次检查您的输出。

标签: python list numpy


【解决方案1】:

在每一步查看a

In [20]: a=np.array([[1,2,3],[3,2,3,4]])                                                               
In [21]: a                                                                                             
Out[21]: array([list([1, 2, 3]), list([3, 2, 3, 4])], dtype=object)

因为内部列表的长度不同,a 是一维对象 dtype。

In [22]: len(a[0])                                                                                     
Out[22]: 3
In [23]: len(a[1])                                                                                     
Out[23]: 4
In [24]: a[1] = a[1][:3]                                                                               
In [25]: a                                                                                             
Out[25]: array([list([1, 2, 3]), list([3, 2, 3])], dtype=object)

仅仅因为我们更改了a[1],它并没有改变a 的形状或数据类型。

即使我们将列表更改为数组也是如此:

In [26]: a[0] = np.array(a[0])                                                                         
In [27]: a[1] = np.array(a[1])                                                                         
In [28]: a                                                                                             
Out[28]: array([array([1, 2, 3]), array([3, 2, 3])], dtype=object)

我们必须使用 stack 之类的东西来将这些数组合并为一个:

In [29]: np.stack(a)                                                                                   
Out[29]: 
array([[1, 2, 3],
       [3, 2, 3]])

这是新数组,不是a的修改。

np.array(a) 也不重新打包 a

如果原始列表匹配,结果将是 2d。'

In [31]: a=np.array([[1,2,3],[3,2,3]])                                                                 
In [32]: a                                                                                             
Out[32]: 
array([[1, 2, 3],
       [3, 2, 3]])

小心这些可能不相等的列表 - 创建对象数组是一个不可靠的后备选项。

【讨论】:

  • 谢谢!我现在明白了
【解决方案2】:

请再次检查您的输出。它对我有用。

a=np.array([[1,2,3],[3,2,3,4]])
for i in range(len(a)):
    if len(a[i])>3:
        a[i]=a[i][:3]
    a[i]=np.array(a[i])
    print(a[i])

输出:

[1 2 3]
[3 2 3]

【讨论】:

  • 我说的是形状,它是 (2, ) 而不是 (2,3)
  • 第4行也应该是a[i]=a[i][:3]
  • 现在检查编辑的答案。删除数字,所以长度不会。
  • 但是你没有将列表修剪成相同的大小,所以形状当然应该是 (2,),看看我在第 4 行中对你的代码所说的话
猜你喜欢
  • 2017-03-08
  • 1970-01-01
  • 2019-08-30
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多