Python - 更改对象形状?

Python - Change object shape?

目前我有一个形状为 (33,) 的元素 X。我想将其更改为 (33, 501),因为我知道每一行确实有 501 个元素。铁。 X[0] = [0, 1, 0, 0, .. 0, 1] 我试过了

np.reshape(X, (33,501))

但是 ValueError: total size of new array must be unchanged 出错了。即使每一行都是 501 长。

我的猜测是您有一个包含 33 个列表的列表,其中的列表长度为 501。

您可以将其转换为二维数组(矩阵)或数据框,这可以通过多种不同的方式完成;一个简单的方法是:

df = pd.DataFrame([])

counter = 0

for array in X:

    df['column_%d' %counter] = array

    counter = counter + 1

您开始使用的结构不是二维数组,而是包含列表作为其元素的一维数组。这可能看起来相似,但实际上完全不同。

典型的(也有例外)m x n 数组是 mn 元素的线性块以及一些 "metadata" 允许 numpy 以正确的方式解释您的索引(如 a[i, j])。

相比之下,您的数组是对象引用的 1d 块(c 用语中的指针),因此如果您想解析单个元素,这会增加另一个间接级别。首先检索列表,然后检索其元素。

您的数组不提供适当的 numpy 数组所提供的大部分便利和速度改进,因此最好转换它。

通常,np.array 工厂会将兼容长度的嵌套序列转换为尽可能深的数组。你的情况是个例外,因为从技术上讲,它已经是一个数组,所以 np.array 只是 shallow-copies 它(它复制列表引用而不是列表本身)包括形状。

绕过这个的一种方法是在转换之前强制转换为列表:

np.array(list(original_array))