从可能迭代的对象的列表/数组中强制创建一维numpy数组

问题描述 投票:1回答:1

我正在尝试是否有一种更漂亮的方法来从另一个对象列表/数组创建(即强制创建)1d numpy数组。但是,这些对象可能具有本身可迭代的条目(因此它们可以是列表,元组等,但也可以是更多任意对象)。

为了使事情变得非常简单,让我考虑以下情形:

a=[(1,2), (3,4), (3,5)]
b=np.array(a, dtype=object)
b.shape # gives (2,3), but I would like to have (3,1) or (3,)

我想知道是否有一种很好的pythonic / numpy'ish方式强制b具有形状(3,),而a中的元素的可迭代结构被忽略。现在,我这样做:

b

可以,但是有点难看。我找不到更好的方式来实现此功能,因为它是numpy内置的。有什么想法吗?

((更多上下文:我真正需要做的是以各种方式重新组合a=[(1,2), (3,4), (3,5)] b=np.empty(len(a), dtype=object) for i,x in enumerate(a): b[i]=x b.shape # gives (3,) this is what i want. 的尺寸,因此,我不想让b知道其元素的尺寸是否可迭代的任何知识)。谢谢!

python arrays numpy loops shapes
1个回答
1
投票
b

从列表中分配时,您无需进行迭代:

In [60]: b = np.empty(3, object)         

对于数组,它不起作用:

In [61]: b[:] = [(1,2),(3,4),(3,5)]                                                            
In [62]: b                                                                                     
Out[62]: array([(1, 2), (3, 4), (3, 5)], dtype=object)
In [63]: b.shape                                                                               
Out[63]: (3,)

您可能在数组的情况下使用了迭代:

In [64]: b[:] = np.array([(1,2),(3,4),(3,5)])                                                  
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-64-3042dce1f885> in <module>
----> 1 b[:] = np.array([(1,2),(3,4),(3,5)])

ValueError: could not broadcast input array from shape (3,2) into shape (3)

请记住,对象dtype数组是一个后备选项。 In [66]: for i,n in enumerate(np.array([(1,2),(3,4),(3,5)])): ...: b[i] = n ...: In [67]: b Out[67]: array([array([1, 2]), array([3, 4]), array([3, 5])], dtype=object) 尝试创建一个多维数组(如果可能)(使用数字dtype)。仅在不可能的情况下才使对象成为dtype。对于某些形状的组合,它会举起手并引发错误。

使用np.array(...)将该数组转换为数组列表也可以(相同速度):

list()
© www.soinside.com 2019 - 2024. All rights reserved.