强制从 list/array 个可能可迭代的对象创建 1d numpy 数组
forcing a creation of 1d numpy array from a list/array of possibly iterable objects
我正在尝试查看是否有更漂亮的方法从另一个 list/array 对象创建(即强制创建)一维 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 方式来强制 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 [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)
你可能在数组的情况下使用了迭代:
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 数组是一种后备选项。 np.array(...)
尽可能尝试创建一个多维数组(使用数字数据类型)。只有在不可能的情况下才会创建对象数据类型。对于某些形状的组合,它会举手并引发错误。
用 list()
将该数组转换为数组列表也可以(同样的速度):
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)
我正在尝试查看是否有更漂亮的方法从另一个 list/array 对象创建(即强制创建)一维 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 方式来强制 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 [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)
你可能在数组的情况下使用了迭代:
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 数组是一种后备选项。 np.array(...)
尽可能尝试创建一个多维数组(使用数字数据类型)。只有在不可能的情况下才会创建对象数据类型。对于某些形状的组合,它会举手并引发错误。
用 list()
将该数组转换为数组列表也可以(同样的速度):
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)