您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

将Python对象存储在Python列表与固定长度的Numpy数组中

将Python对象存储在Python列表与固定长度的Numpy数组中

不要在numpy中使用对象数组进行此类操作。

它们破坏了numpy数组的基本目的,尽管它们在少数情况下很有用,但它们几乎总是一个糟糕的选择。

是的,在python中访问numpy数组的单个元素或在python中访问numpy数组要比使用等效操作慢list。(这就是为什么你不应该做这样的事情y = [item * 2 for item in x]的时候x一个numpy的阵列。)

Numpy对象数组的内存开销比列表要低一些,但是如果要存储这么多的python对象,则首先会遇到其他内存问题。

Numpy首先是一个存储效率高的多维数组容器,用于存储统一的数值数据。如果要在numpy数组中保存任意对象,则可能需要一个列表。

我的观点是,如果您想有效地使用numpy,则可能需要重新考虑如何构造事物。

而不是将每个对象实例存储在numpy数组中,而是将 数值 数据存储在numpy数组中,并且如果需要为每个行/列/任何对象使用单独的对象,请在每个实例中将索引存储到该数组中。

这样,您可以快速对数值数组进行操作(即使用numpy而不是列表推导)。

作为我正在谈论的快速示例,这是一个不使用numpy的简单示例:

from random import random

class PointSet(object):
    def __init__(self, numpoints):
        self.points = [Point(random(), random()) for _ in xrange(numpoints)]

    def update(self):
        for point in self.points:
            point.x += random() - 0.5
            point.y += random() - 0.5

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

points = PointSet(100000)
point = points.points[10]

for _ in xrange(1000):
    points.update()
    print 'Position of one point out of 100000:', point.x, point.y

还有一个使用numpy数组的类似示例:

import numpy as np

class PointSet(object):
    def __init__(self, numpoints):
        self.coords = np.random.random((numpoints, 2))
        self.points = [Point(i, self.coords) for i in xrange(numpoints)]

    def update(self):
        """Update along a random walk."""
        # The "+=" is crucial here... We have to update "coords" in-place, in
        # this case. 
        self.coords += np.random.random(self.coords.shape) - 0.5

class Point(object):
    def __init__(self, i, coords):
        self.i = i
        self.coords = coords

    @property
    def x(self):
        return self.coords[self.i,0]

    @property
    def y(self):
        return self.coords[self.i,1]


points = PointSet(100000)
point = points.points[10]

for _ in xrange(1000):
    points.update()
    print 'Position of one point out of 100000:', point.x, point.y

还有其他方法可以做到这一点(例如,您可能希望避免在每个numpy数组中存储对 特定 引用的引用point),但是我希望这是一个有用的示例。

注意它们运行速度的差异。在我的机器上,numpy版本与纯python版本相差5秒,而纯Python版本相差60秒。

python 2022/1/1 18:34:58 有231人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶