NumPy在创建数组时非常有用。如果numpy.array
的第一个参数具有__getitem__
和__len__
方法,则基于它们可能是有效序列来使用它们。防止numpy创建多维数组
不幸的是我想创建一个包含dtype=object
而不是NumPy“有帮助”的数组。
分解为一个最小的例子中,类将是这样的:
import numpy as np
class Test(object):
def __init__(self, iterable):
self.data = iterable
def __getitem__(self, idx):
return self.data[idx]
def __len__(self):
return len(self.data)
def __repr__(self):
return '{}({})'.format(self.__class__.__name__, self.data)
,如果“iterables”有不同的长度,一切都很好,我得到正是我想要的结果:
>>> np.array([Test([1,2,3]), Test([3,2])], dtype=object)
array([Test([1, 2, 3]), Test([3, 2])], dtype=object)
但NumPy的创建一个多维数组,如果这些发生在具有相同的长度:
>>> np.array([Test([1,2,3]), Test([3,2,1])], dtype=object)
array([[1, 2, 3],
[3, 2, 1]], dtype=object)
不幸的是,只有ndmin
的论点,所以我想知道是否有一种方法来执行ndmax
或以某种方式防止NumPy将自定义类解释为另一维(不删除__len__
或__getitem__
)?
我试图寻找类似的问题,但我还没有发现任何。也许我只是搜索错误的短语。如果您有任何提及较早的问题,那就太棒了。谢谢你的回答,但我实际上并没有寻找解决方法。我更关心的是如何在事先不知道确切长度的情况下定义数组的最大深度(维),或者禁用numpy将自定义类实例解释为序列。 – MSeifert
通过将您的类更改为子类'dict',我可以阻止它在您的实例上迭代。这表明'np.array'正在测试多于'__getitem__'。但是我一直无法找到执行这种检查的代码。 – hpaulj
http://stackoverflow.com/questions/36663919/override-a-dict-with-numpy-support - 与同一问题的斗争;控制'np.array'是否迭代你的自定义类。同样的解决方法。 – hpaulj