Python 如何使一个函数从子数组中生成一个大数组既高效又可读?

Python 如何使一个函数从子数组中生成一个大数组既高效又可读?,python,numpy,Python,Numpy,我有一个函数,它可以生成几个较小的numpy数组,并将它们连接到一个较大的数组中。大致如下: def make_big_array(second, third): big_array = make_first() if second: big_array += make_second() if third: big_array += make_third() return big_array 基本上,我有一个协调函数,它检查大数组是否应该包含一

我有一个函数,它可以生成几个较小的numpy数组,并将它们连接到一个较大的数组中。大致如下:

def make_big_array(second, third):
   big_array = make_first()
   if second:
      big_array +=  make_second()
   if third:
      big_array += make_third()
   return big_array
基本上,我有一个协调函数,它检查
大数组
是否应该包含一些子数组,生成它们,然后将它们添加到它想要返回的
大数组
。但是,我认为先创建每个数组,然后将其连接到
大数组的末尾是低效的


我想另一种方法可能是使用
second
third
计算
big\u数组
最终会持续多长时间,然后通过
make\u second()
make\u third()
大数组
以及开始填充它的索引,但这看起来不是很可读。有人对如何使其快速可读有任何建议吗?

您可以单独创建所有数组,然后一次性将它们连接起来:

def make_big_array(second, third):
    arrays = [make_first()]
    if second:
        arrays.append(make_second())
    if third:
        arrays.append(make_third())
    return np.concatenate(arrays)

您可以单独创建所有阵列,然后一次性连接它们:

def make_big_array(second, third):
    arrays = [make_first()]
    if second:
        arrays.append(make_second())
    if third:
        arrays.append(make_third())
    return np.concatenate(arrays)
如本文所述,建议预先分配一个数组并在其中存储值。使用此方法,程序无需在每次将数组追加到原始数组时更改数组的大小。您可以为您的案例执行以下操作:

a = np.random.rand(1000000, 10)
second = np.random.rand(5000, 10)
third = np.random.rand(4000, 10)
if second:
    new = np.empty([len(a)+len(second), a.shape[1]])
    new[:len(a)] = a
    new[len(a):] = second
if third:
    new = np.empty([len(a)+len(third), a.shape[1]])
    new[:len(a)] = a
    new[len(a):] = third
但是,只要您只是连接两个阵列,通过这种方式获得的效率就可以忽略不计

如本文所述,建议预先分配一个数组并在其中存储值。使用此方法,程序无需在每次将数组追加到原始数组时更改数组的大小。您可以为您的案例执行以下操作:

a = np.random.rand(1000000, 10)
second = np.random.rand(5000, 10)
third = np.random.rand(4000, 10)
if second:
    new = np.empty([len(a)+len(second), a.shape[1]])
    new[:len(a)] = a
    new[len(a):] = second
if third:
    new = np.empty([len(a)+len(third), a.shape[1]])
    new[:len(a)] = a
    new[len(a):] = third

但是,只要您只是连接两个阵列,通过这种方式获得的效率就可以忽略不计

这看起来确实可读,但它的效率有多高?可能比我的方法更简单,但这不是比让每个函数附加其值而不是创建子数组要慢一点吗?这看起来确实可读,但效率有多高?可能比我的方法更简单,但这不是比让每个函数附加其值而不是创建子数组慢了一点吗?这个想法很好。它可以通过使用
np.empty
来改进,这是预分配内存的最有效的方法。虽然链接文章中的总体思路是好的,但编码很差。尤其是这一行
np.append(results,[processed_entry])
有严重缺陷<代码>np.append
不能就地运行。这个主意很好。它可以通过使用
np.empty
来改进,这是预分配内存的最有效的方法。虽然链接文章中的总体思路是好的,但编码很差。尤其是这一行
np.append(results,[processed_entry])
有严重缺陷
np.append
不就地操作。是否在列表连接意义中使用
+=
?因为在
numpy
中,这是数字加法。这样或那样,您将生成2个数组(除非
make_second()
中有一些魔法)。然后是否将这些数组复制到预分配的
大数组的适当切片,或者将它们收集到列表中,并进行一次
连接,这无关紧要。是否在列表连接意义上使用
+=
?因为在
numpy
中,这是数字加法。这样或那样,您将生成2个数组(除非
make_second()
中有一些魔法)。然后是否将这些数组复制到预分配的
大数组的适当切片,或者将它们收集到列表中,然后进行一次
连接,这都无关紧要。