动态追加N维数组

时间:2016-11-16 14:37:36

标签: python arrays numpy append concatenation

如果每个阵列都具有形状(1000,2,100),则很容易使用

con = np.concatenate((array_A, array_B))

连接它们,因此con具有形状(2000,2,100)。

我想在函数中动态追加或连接“con”。该步骤描述如下:

First, read data from the first file and process data to generate an array.

Secondly, read date from the second file and append generated array into the first array

....

def arrayappend():
     for i in range(n):
         #read data from file_0 to file_n-1
         data = read(file_i)
         #data processing to generate an array with shape (1000, 2, 100)
         con = function(data)
         # append con

3 个答案:

答案 0 :(得分:1)

假设您的所有文件都生成相同的形状对象,并且您希望在第一维上加入它们,则有以下几种选择:

BeaconManager.setRegionExitPeriod(2000); // 2 seconds

alist = [] for f in files: data = foo(f) alist.append(f) arr = np.concatenate(alist, axis=0) 列出一个列表。如果您想添加新轴(concatenatenp.array(alist)等),可能会有各种变化。

附加到列表很快,因为它只是意味着添加指向np.stack对象的指针。 data从组件创建一个新数组;它已编译但仍然相对较慢。

如果您必须/想要在每个阶段创建一个新数组,您可以写:

concatenate

这可能比较慢,但是如果文件加载步骤足够慢,你可能不会发现差异。

小心,您可以从 arr = function(files[0]) for f in files[1:]: data = foo(f) arr = np.concatenate((arr, data), axis=0) 开始,并阅读循环中的所有文件。你必须确保最初的空白'数组具有兼容的形状。新用户经常遇到此问题。

答案 1 :(得分:0)

如果您在迭代期间绝对想要这样做,那么:

def arrayappend():
  con = None
  for i, d in enumerate(files_list):
    data = function(d)
    con = data if i is 0 else np.vstack([con, data])

这应该垂直堆叠。

答案 2 :(得分:0)

非常不漂亮,但它能实现你想要的吗?这是没有优化的方式。

def arrayappend():
    for i in range(n):
        data = read(file_i)
        try:
            con
            con = np.concatenate((con, function(data)))
        except NameError:
            con = function(data)
    return con

第一个循环将采用except分支,随后不会。