当前位置: 首页 > 面试题库 >

增长numpy数字数组的最快方法

宦兴朝
2023-03-14
问题内容

要求:

  • 我需要从数据中任意增加一个数组。
  • 我可以猜测大小(大约100-200),但不能保证每次都适合该数组
  • 一旦增长到最终大小,我就需要对其进行数值计算,因此我更希望最终使用二维numpy数组。
  • 速度至关重要。例如,对于300个文件之一,update()方法被称为4500万次(大约需要150秒),而finalize()方法被称为500k次(总共需要106s)……总共需要250s或者。

这是我的代码:

def __init__(self):
    self.data = []

def update(self, row):
    self.data.append(row)

def finalize(self):
    dx = np.array(self.data)

我尝试过的其他操作包括以下代码…但这速度会慢一些。

def class A:
    def __init__(self):
        self.data = np.array([])

    def update(self, row):
        np.append(self.data, row)

    def finalize(self):
        dx = np.reshape(self.data, size=(self.data.shape[0]/5, 5))

这是如何称呼它的示意图:

for i in range(500000):
    ax = A()
    for j in range(200):
         ax.update([1,2,3,4,5])
    ax.finalize()
    # some processing on ax

问题答案:

我尝试了一些不同的事情,并进行了时间安排。

import numpy as np
  1. 您提到的缓慢方法:(32.094秒)

    class A:
    
    def __init__(self):
        self.data = np.array([])
    
    def update(self, row):
        self.data = np.append(self.data, row)
    
    def finalize(self):
        return np.reshape(self.data, newshape=(self.data.shape[0]/5, 5))
    
  2. 常规ol Python列表:(0.308秒)

    class B:
    
    def __init__(self):
        self.data = []
    
    def update(self, row):
        for r in row:
            self.data.append(r)
    
    def finalize(self):
        return np.reshape(self.data, newshape=(len(self.data)/5, 5))
    
  3. 尝试在numpy中实现arraylist:(0.362秒)

    class C:
    
    def __init__(self):
        self.data = np.zeros((100,))
        self.capacity = 100
        self.size = 0
    
    def update(self, row):
        for r in row:
            self.add(r)
    
    def add(self, x):
        if self.size == self.capacity:
            self.capacity *= 4
            newdata = np.zeros((self.capacity,))
            newdata[:self.size] = self.data
            self.data = newdata
    
        self.data[self.size] = x
        self.size += 1
    
    def finalize(self):
        data = self.data[:self.size]
        return np.reshape(data, newshape=(len(data)/5, 5))
    

这就是我的计时方式:

x = C()
for i in xrange(100000):
    x.update([i])

因此,看起来常规的旧Python列表相当不错;)



 类似资料:
  • 问题内容: 我在AI项目上使用Redis。 这个想法是让多个环境模拟器在许多cpu内核上运行策略。模拟器将体验(状态/操作/奖励元组列表)写入Redis服务器(重播缓冲区)。然后,培训过程将经验作为数据集读取以生成新策略。将新策略部署到模拟器,删除先前运行的数据,然后继续该过程。 大部分经验都记录在“状态”中。通常将其表示为尺寸为80 x 80的大型numpy数组。模拟器会以cpu允许的最快速度生

  • 问题内容: 我不是太在意时间效率(这种操作很少见),而是在内存效率上: 我可以在不将所有值都临时设置两次的情况下增加数组吗? 有没有比创建一个新数组并复制所有值更有效的方法来增长大型数组?喜欢,将其与新的连接起来吗? 将固定大小的数组存储在另一个数组中并重新分配/复制该顶级数组会怎样?会保留实际值吗? 我知道ArrayList,但是我需要对访问数组进行大量控制,并且访问必须非常快。举例来说,我想我

  • 问题内容: 我有一个从1到100(包括两端)的数字数组。数组的大小为100。将数字随机添加到数组中,但是数组中有一个随机的空插槽。找到该插槽的最快方法是什么,应该在插槽中放入多少?最好使用Java解决方案。 问题答案: 你可以在O(n)中执行此操作。遍历数组并计算所有数字的总和。现在,从1到N的自然数之和可以表示为。在你的情况下,N = 100。 从中减去数组的总和,其中N = 100。 那是丢失

  • 问题内容: 信不信由你,在分析当前代码后,numpy数组还原的重复操作将占用大量的运行时间。我现在拥有的是基于视图的常见方法: 还有其他方法可以更有效地执行此操作,还是我对不切实际的numpy性能的痴迷所致的幻觉? 问题答案: 创建时,您正在创建原始数组的视图。然后,您可以更改原始数组,并且视图将更新以反映所做的更改。 您是否经常需要重新创建视图?您应该能够执行以下操作: 我不是numpy专家,但

  • 我有一个数组,并希望将其广播到,但仅适用于的情况。否则应该用零填充。当然,我可以创建新的空数组并用填充它,如下所示: 不幸的是,这两个方法都用值填充所有对。 我的问题是,如果这是可能的创建数组的形状我需要使用大步和没有实际复制数据?

  • 问题内容: 我确实检测到一个数字的位数。例如,具有数字。 我所做的只是将数字解析为字符串,并获取字符串长度,例如: 但是,有没有一种最快的方法可以对数字进行计数?我必须多次使用此方法,因此我认为使用会影响性能。 谢谢。 问题答案: Math.floor(Math.log10(number) + 1) // or just (int) Math.log10(number) + 1 例如: 输出: