堆栈列表元素来制作一个数组?

时间:2014-04-28 11:04:50

标签: python numpy

我有一个列表X,其中len(X)= 53,即np数组。每个阵列都有n行和303列/元素。为了给出更真实的直觉:我有53个图像,每个我提取n个(不同的)部分,每个部分由303个长特征向量表示。

如何将所有内容放在一起,使X成为X.shape=(53*n_parts, 303)

的数组

对于训练,我需要有X(特征向量)和目标Y,但在这种情况下,每个训练样例的X是303元素向量。所以我必须找到一种方法来生成一个包含303个特征向量的53 * n_parts元素的数组。

3 个答案:

答案 0 :(得分:1)

在numpy中将数组堆叠在一起有several functions。在您的情况下,似乎最有用的是np.vstack

import numpy as np
result_array = np.vstack(tuple(list_of_arrays))

请注意vstack需要一个数组元组,因此您可能需要进行类型转换。

答案 1 :(得分:0)

我不知道你要做什么。但你可能想这样做吗?

n_parts = 10
img1  = np.empty(shape=(n_parts, 303), dtype=int)
img2  = np.empty(shape=(n_parts, 303), dtype=int)
...
img53 = np.empty(shape=(n_parts, 303), dtype=int)

imgs = np.empty(shape=(53, n_parts, 303), dtype=int)

imgs[0] = img1
imgs[1] = img2
...
imgs[52] = img53

答案 2 :(得分:0)

看起来你正在进行某种主成分分析。

您需要自己测试这些方法的性能。

让我们先谈谈你的数据,你有一个53-by-em> n -by-303三维矩阵。我假设 n 的值在所有图像中都是一致的。

方法1

您可能希望对图像数据进行矢量化,因此对于每个图像而言,不是 n -by-303,而是将其设为1-by - ( n * 303) - 换句话说,行向量的第一个元素将是第一行的第一个元素,行向量的第304个元素将是第二行的第一个元素,等等。

因此,对于每个图像,您将拥有行向量,对于整个53个图像集,您将拥有53个行向量。这些可以形成一个矩阵 - 最终将是53×(像素数)矩阵。

# Convert the elements of X to row vectors
for i,x in enumerate(X): X[i] = x.reshape(1, size(x))

# Convert the row vectors to a matrix
XX = np.vstack(X)

从那里,您可以切片您感兴趣的组件:

components = [1,517,1267,...]

FV = XX[:,components]

此时,FV是53-by - (#components)矩阵。

方法2

而不是创建巨大的矩阵并将其切片,而是只从每个数组中提取您感兴趣的组件。

components = [1,517,1267,...]

FV = np.empty([53, size(components)])

for i,x in enumerate(X):
    row = x.reshape(1, size(x))  # Row is the image matrix, reshaped as a row vector
    FV[i] = row[:, components]

components = [1,517,1267,...]

for i,x in enumerate(X):
    # Don't explicitly flatten the matrix, just use the 1-D iterator
    FV[i] = row.flat[components]

此时,FV是53-by - (#components)矩阵。