以下调用是否会因x
的任何值而引发错误:
arr = np.array(x, copy=False, subok=False)
我尝试过一些不同的输入但我可能无效,但我得到的最差的是带有dtype=object
的标量数组。
我明白设置dtype
参数很容易让我TypeError
。
答案 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扩展,这比我想要的更多工作。 (实际上,我确实尝试通过memoryview
从array.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嵌套列表。