Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 强制从可能可编辑对象的列表/数组创建1d numpy数组_Python_Arrays_Numpy_Loops_Shapes - Fatal编程技术网

Python 强制从可能可编辑对象的列表/数组创建1d numpy数组

Python 强制从可能可编辑对象的列表/数组创建1d numpy数组,python,arrays,numpy,loops,shapes,Python,Arrays,Numpy,Loops,Shapes,我想看看是否有更漂亮的方法从另一个对象列表/数组创建(即强制创建)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/nu

我想看看是否有更漂亮的方法从另一个对象列表/数组创建(即强制创建)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
中被忽略。现在我这样做:

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. 
这很管用,但有点难看。我找不到一个更好的方法来实现这一点,因为它更内置于numpy中。有什么想法吗

(更多上下文:我真正需要做的是以各种方式重新排列
b
的维度,因此我不想
b
了解其元素的维度(如果它们是可移植的)。 谢谢

从列表分配时,不需要迭代:

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)
请记住,对象数据类型数组是一个有点后撤的选项
np.array(…)
尽可能尝试创建多维数组(使用数字数据类型)。只有在不可能的情况下,才可以创建对象数据类型。对于某些形状组合,它会举手并引发错误

使用
list()
将该数组转换为数组列表同样有效(速度相同):


numpy有一个重塑,如果这是你要问的谢谢,不,这不是我要问的。我的意思是上下文的最后一部分,即一旦我将数组
b
设置为“正确”的形式,以后再重新设置它的形状(即使用
np.reformate
)。谢谢。。事实上,我想要一种适用于任意对象的东西,即使
a
是一个数组。我想在numpy例程中可能有一些我错过的东西,可以告诉他们在尝试计算维度时下降的“深度”,但我想我正在做的迭代可能是唯一(丑陋)的方法。我将把这个问题留待讨论,看看是否还有其他想法。我认为将alist分配给一维对象数组是非常可靠的<代码>b[:]=列表(..)。如果需要,可以在填充后重塑对象阵列。
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)
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)
In [92]: b[:] = list(np.array([(1,2),(3,4),(3,5)]))                                            
In [93]: b                                                                                     
Out[93]: array([array([1, 2]), array([3, 4]), array([3, 5])], dtype=object)