python - 如何创建一个 numpy 数组,其元素是其他 numpy 数组对象?

标签 python arrays python-3.x numpy

我发现自己需要创建一个 dtype="object"的 numpy 数组,其元素本身就是 numpy 数组。如果数组长度不同,我可以设法做到这一点:

arr_of_arrs = np.empty((2,2), dtype=np.object)
arr_list = [np.arange(i) for i in range(4)]
arr_of_arrs.flat[:] = arr_list
print(arr_of_arrs)

array([[array([], dtype=int32), array([0])],
   [array([0, 1]), array([0, 1, 2])]], dtype=object)

但是如果它们碰巧长度相同,则它不起作用,而且我不完全确定它如何生成它给我的值:

arr_list = [np.arange(2) for i in range(4)]
arr_of_arrs.flat[:] = arr_list
print(arr_of_arrs)

[[0 1]
[0 1]]

这可行吗? numpy 似乎试图强制数据“有意义”,尽管我尽了最大努力阻止它这样做......

最佳答案

如果数组是一维,则赋值工作正常:

In [767]: arr = np.empty(4,object)                                                             
In [768]: arr[:] = [np.arange(6) for _ in range(4)]                                            
In [769]: arr                                                                                  
Out[769]: 
array([array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5]),
       array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])], dtype=object)
In [770]: arr.reshape(2,2)                                                                     
Out[770]: 
array([[array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])],
       [array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])]],
      dtype=object)

我们也可以从 (2,2) 开始,但分配给 ravel() (一个 view):

In [771]: arr = np.empty((2,2),object)                                                         
In [772]: arr.ravel()[:] = [np.arange(6) for _ in range(4)]                                    
In [773]: arr                                                                                  
Out[773]: 
array([[array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])],
       [array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])]],
      dtype=object)

flat 显然序列化了 RHS:

In [774]: arr.flat = [np.arange(6) for _ in range(4)]                                          
In [775]: arr                                                                                  
Out[775]: 
array([[0, 1],
       [2, 3]], dtype=object)

如果 RHS 列表嵌套在右侧,我们可以直接分配给二维数组:

In [779]: alist = Out[770].tolist()                                                            
In [780]: alist                       # list of lists of arrays                                                         
Out[780]: 
[[array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])],
 [array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])]]
In [781]: arr = np.empty((2,2),object)                                                         
In [782]: arr[:] = alist                                                                       
In [783]: arr                                                                                  
Out[783]: 
array([[array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])],
       [array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3, 4, 5])]],
      dtype=object)

关于python - 如何创建一个 numpy 数组,其元素是其他 numpy 数组对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60313171/

相关文章:

python - 如何以最少的轮数按升序收集数字?

java - 如何在Java中制作数组数组

python - 如何用唯一 ID 替换 Python Pandas 表文本值?

python-3.x - 无需 pandas/numpy 即可对数据进行 Pythonic 方式

python - 为什么我不能在 pyttsx3 中改变声音?

python - 是否有用于 Unicode 空白的 Python 常量?

python - sre_constants.错误: invalid group reference Python regular expressions

python - 检查字符串中的前几个字符

javascript - 防止数组过滤器匹配与所需元素没有相同索引的元素

c - 如何在 C 中创建一个函数,允许我根据分隔符将字符串拆分为数组?