首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含可迭代对象的Numpy数组

包含可迭代对象的Numpy数组
EN

Stack Overflow用户
提问于 2014-03-10 00:34:15
回答 3查看 384关注 0票数 2

通常,可以将任意对象放入numpy数组:

代码语言:javascript
复制
class Foo(object):
    pass
np.array([ Foo() ])
>>> array([<__main__.Foo object at 0x10d7c3610>], dtype=object)

但是,实现__len____getitem__的对象似乎自动“解压缩”:

代码语言:javascript
复制
class Foo(object):
    def __len__(self): return 3
    def __getitem__(self, i): return i*11
np.array([ Foo() ])
>>> array([[0, 11, 22]])

有什么方法可以阻止numpy以这种方式解压对象吗?我想要的是将一些对象放入一个numpy数组中,并将它们作为对象本身存储,而不需要进行解压缩。所以想要的行为是:

代码语言:javascript
复制
class Foo(object):
    def __len__(self): return 3
    def __getitem__(self, i): return i*11
np.array([ Foo() ])
>>> array([<__main__.Foo object at 0x10d7c3610>], dtype=object)

现在,我理解了鸭子输入的想法意味着numpy应该打开任何看起来像列表的东西。但是,也许可以以某种方式标记类Foo,告诉numpy不要打开它?例如,ABC:

代码语言:javascript
复制
numpy.Nonenumerable.register(Foo)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-10 00:44:41

代码语言:javascript
复制
x = numpy.empty(appropriate_shape, dtype=object)
x[:] = your_list_of_foos

例如,对于1 Foo的一维数组,

代码语言:javascript
复制
x = numpy.empty([1], dtype=object)
x[:] = [Foo()]

这样做的好处是可以处理您无法控制的类型,或者系统的其他部分可能希望被解压缩。例如,如果希望将2个列表视为一维列表数组,

代码语言:javascript
复制
x = numpy.empty([2], dtype=object)
x[:] = [[], []]
票数 4
EN

Stack Overflow用户

发布于 2014-03-10 00:37:51

numpy的目的是研究数字。因此,人们预计,在一个一维数组中,打开这些列表将是正确的行为(也就是说,您正在生成向量的级联)。

您可能需要的是一个N维阵列,或者一个矩阵

或者,我相信您可以使用array 构造函数的可选参数获得所需的结果。

代码语言:javascript
复制
np.array(MyListOfLists, dtype = list)
票数 0
EN

Stack Overflow用户

发布于 2014-03-10 00:39:12

也许把类似数组的对象封装在容器中?

代码语言:javascript
复制
class Bar():
    def __init__(self):
        self.foo = Foo()

Np.array(律师())

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22290204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档