Python - 更改对象形状?

时间:2017-02-09 21:40:11

标签: python numpy reshape

目前我有一个具有形状(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长。

2 个答案:

答案 0 :(得分:1)

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

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

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

你的阵列并没有提供适当的numpy阵列所带来的大部分便利和速度提升,所以最好转换它。

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

绕过此方法的一种方法是在转换前转换为列表:

np.array(list(original_array))

答案 1 :(得分:0)

我的猜测是你有一个包含33个长度为501的列表。

你可以将它转换成二维数组(矩阵)或数据帧,可以用几种不同的方式完成;一个简单的方法是:

df = pd.DataFrame([])

counter = 0

for array in X:

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

    counter = counter + 1