【问题标题】:How to interface Numpy's ndarrays to store objects in?如何连接 Numpy 的 ndarray 来存储对象?
【发布时间】:2020-11-14 22:32:55
【问题描述】:

我想将一系列不同大小的数组存储到一个“父”数组中。像这样:

import numpy as np
    
a1 = np.array([[1,2], [3,4], [5,6]]) 
a2 = np.array([7,3]) 
a3 = np.array([1])

# What I want to do
a_parent = np.ndarray(a1, a2, a3)
    
# Desired output
print(a_parent[0])
>>> [[1 2]
    [3 4]
    [5 6]]
    
print(a_parent[1])
>>> [7 3]
    
print(a_parent[2])
>>> [1]

我知道这是可能的,因为当我使用 loadmatscipy.io 库中导入 Matlab 单元格数据时,数据会转换为 numpy ndarray 并且其行为与上面完全相同。我查看了numpy docs,但找不到一个可行的示例来展示我自己如何做到这一点。

【问题讨论】:

  • 为什么不直接使用 np.array?
  • 真 @NicolasGervais 。 parent_array = np.array([a1,a2,a3]) 这应该可以工作

标签: python arrays numpy multidimensional-array numpy-ndarray


【解决方案1】:
In [5]: a1 = np.array([[1,2], [3,4], [5,6]])  
   ...: a2 = np.array([7,3])  
   ...: a3 = np.array([1])       

最好的方法是制作一个具有所需数据类型和形状的“空白”数组:

In [6]: a_parent = np.empty(3, object)                                                               
In [7]: a_parent                                                                                     
Out[7]: array([None, None, None], dtype=object)

并从所需数组(或其他对象)的列表中“填充”它:

In [13]: a_parent[:] = [a1,a2,a3]                                                                    
In [14]: a_parent                                                                                    
Out[14]: 
array([array([[1, 2],
       [3, 4],
       [5, 6]]), array([7, 3]),
       array([1])], dtype=object)

我确定loadmat 使用这种方法。

将列表直接传递给np.array 可能有效,但v1.19 希望我们包含object dtype:

In [10]: np.array([a1,a2,a3])                                                                        
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
  #!/usr/bin/python3
Out[10]: 
array([array([[1, 2],
       [3, 4],
       [5, 6]]), array([7, 3]),
       array([1])], dtype=object)

如果数组都是相同的形状,这不起作用:

In [11]: np.array([a1,a1])                                                                           
Out[11]: 
array([[[1, 2],
        [3, 4],
        [5, 6]],

       [[1, 2],
        [3, 4],
        [5, 6]]])

对于某些形状组合,我们会遇到错误。

In [15]: a_parent[:] = [a3,a3,a3]                                                                    
In [16]: a_parent                                                                                    
Out[16]: array([array([1]), array([1]), array([1])], dtype=object)

【讨论】:

  • 这是完美的。虽然如何将新数组附加到 a_parent?
  • 有一整套np.concatenatestack 函数可以从数组列表中创建一个新数组。但他们可能对匹配尺寸很挑剔。最好附加到列表中。
【解决方案2】:

根据documentationndarray 是:

数组对象表示固定大小的项目的多维同构数组。

所以你不能有不同大小的对象。然后你应该使用这个:

a_parent = np.array([a1, a2, a3])

np.array 允许不同大小的元素

【讨论】:

  • 类似np.concatenate([a_parent, np.array([1, 2, 3])], axis=0)
  • 所以我想这样做 a_parent = np.concatenate([a_parent, a1], axis=0) 并用 a_parent[3] 索引最后一个数组。我收到一个错误
【解决方案3】:

您可以像这样创建一个列表并使用np.array

a_parent = np.array([a1, a2, a3], dtype=object)

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 2017-05-25
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多