【问题标题】:Is a set converted to numpy array?一个集合是否转换为 numpy 数组?
【发布时间】:2020-04-23 18:13:25
【问题描述】:
我正在使用以下方法创建一个 ndarray:
import numpy as np
arr=np.array({1,2})
print(arr, type(arr))
哪个输出
{1, 2} <class 'numpy.ndarray'>
如果它的类型是numpy.ndarray,那么o/p必须像[1,2]这样的方括号?
谢谢
【问题讨论】:
标签:
python
numpy
multidimensional-array
【解决方案1】:
是的,但这是因为您在函数 np.array 上放置了一个集合而不是列表
如果你试试这个:
import numpy as np
arr=np.array([1,2])
print(arr, type(arr))
你得到:
[1 2] <class 'numpy.ndarray'>
【解决方案2】:
这与您想象的略有不同。您实际上是在构建一个object 类型的数组,而不是使用您指定的数据(数字 1 和 2)构建一个数组。见下文:
>>> np.array({1, 2)).dtype
dtype('O')
这是因为集合不是“类数组”,在 NumPy 的术语中,特别是它们不是有序的。因此,数组构造不是用集合的内容构建一个数组,而是将集合本身作为一个对象。
如果您真的想从集合的内容构建一个数组,您可以执行以下操作:
>>> x = np.fromiter(iter({1, 2}), dtype=int)
>>> x.dtype
dtype('int64')
编辑:This answer 有助于解释如何使用各种类型在 NumPy 中构建数组。
【解决方案3】:
它返回一个没有维度的 numpy 数组对象。集合是一个对象。它类似于传递numpy.array 一个数字(不带括号)。看看这里的区别:
arr=np.array([1])
arr.shape: (1,)
arr=np.array(1)
arr.shape: ()
arr=np.array({1,2})
arr.shape: ()
因此,它将您的整个集合视为一个对象,并创建一个没有维度的 numpy 数组,该数组仅返回集合对象。集合不是array-like 并且没有顺序,因此根据numpy array doc 它们不会像您期望的那样转换为数组。如果你想从一个集合中创建一个 numpy 数组并且你不关心它的顺序,使用:
arr=np.fromiter({1,2},int)
arr.shape: (2,)
【解决方案4】:
ipython 的 repr 显示可能会更清楚:
In [162]: arr=np.array({1,2})
In [163]: arr
Out[163]: array({1, 2}, dtype=object)
arr 是 0d 数组,对象 dtype,包含 1 项,集合。
但是如果我们先把集合变成一个列表:
In [164]: arr=np.array(list({1,2}))
In [165]: arr
Out[165]: array([1, 2])
现在我们有一个 1d (2,) 整数 dtype 数组。
np.array(...) 将列表(和类似列表)参数转换为多维数组。 set 不够 list-like。