没有dtype参数调用np.array会引发错误吗?

时间:2018-04-03 21:30:16

标签: python numpy

以下调用是否会因x的任何值而引发错误:

arr = np.array(x, copy=False, subok=False)

我尝试过一些不同的输入但我可能无效,但我得到的最差的是带有dtype=object的标量数组。

我明白设置dtype参数很容易让我TypeError

2 个答案:

答案 0 :(得分:3)

烨。

>>> numpy.array([1, [2]], copy=False, subok=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence.

在NumPy版本1.14.2上进行测试,以防万一。

答案 1 :(得分:3)

最简单的方法是只传递一个对象,它就像一个序列一样,让array将它视为一个,但是一旦它开始就把它扔掉。我无法记住array考虑序列的确切规则,但它仍然很容易找到破坏的东西。

例如,在实现(通过旧式序列迭代器协议)对象实际具有长度0之前,将其混淆为构建size-2数组:

class BadSeq:
    def __len__(self):
        return 2
    def __getitem__(self, idx):
        raise IndexError()

现在np.array(BadSeq())会提出:

ValueError: cannot copy sequence with size 2 to array axis with dimension 0

相比之下,list(BadSeq())将返回一个空列表。

或者完全违反序列协议:

class BadSeq:
    def __len__(self):
        return 2
    def __getitem__(self, idx):
        raise TypeError(f"Take your {type(idx).__name__} and shove it")

现在np.array(BadSeq())只会通过TypeError通过:

TypeError: Take your int and shove it

当然,list具有相同的行为。

我相信你可以使用缓冲协议玩类似的技巧,但这需要构建一个C扩展,这比我想要的更多工作。 (实际上,我确实尝试通过memoryviewarray.array通过ctypes.pythonapi攻击x = [] x.append(x) arr = np.array(x, copy=False, subok=False) ,但事实证明,段错误比例外情况更容易获得,如果是这样的话你想要什么,有更好的方法来做到这一点...)

作为旁注,以下代码引发异常,但可能没有做你想做的事情:

x

原始arr是一个无限维嵌套列表,但arr[(1,)*32])是一个32D数组,其单个元素(x)是对object的引用, y = [] for _ in range(33): y = [y[:]] arr = np.array(y, copy=False, subok=False) 。虽然通过有限嵌套获得了相同的结果:

class Project(models.Model):
    customer =  models.ForeignKey(
                                settings.AUTH_USER_MODEL,
                                on_delete = models.CASCADE,)
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=timezone.now)

这为您提供了一个32D数组,其单个元素是一个3D嵌套列表。