由于numpy数组的形状(x,),我最近遇到了一些错误 - 这些可以通过下面的代码段轻松修复
a = np.array([1,2,3,4]) #this form produced a bug
a.shape
>>> (4,)
a.shape = [4,1] #but this change fixed it
但它确实让我想知道,为什么(x,)是1D数组的默认形状?
答案 0 :(得分:2)
forEach()
元组中的每个项表示一个轴。如果你有一个项目意味着你的数组是1维(1轴),否则它将是一个2D数组。执行var data = [[{"10":{"key1":1,"key2":2,"key3":3},"11":{"key1":1,"key2":2,"key3":3},"12":{"key1":1,"key2":2,"key3":3}},{},{}],[{"10":{"key1":1,"key2":2,"key3":3},"11":{"key1":1,"key2":2,"key3":3},"12":{"key1":1,"key2":2,"key3":3}},{},{}]]
var result = data.reduce(function(r, e, i) {
if (i == 0) r = r.concat(e)
else {
e.forEach(function(a, j) {
Object.keys(a).forEach(function(key) {
if (!r[j][key]) r[j][key] = a[key]
else {
Object.keys(a[key]).forEach(function(k) {
r[j][key][k] += a[key][k]
})
}
})
})
}
return r;
}, [])
console.log(result)
时,您只需将1D数组转换为2D:
shape
答案 1 :(得分:1)
我怀疑这个问题即将出现,因为你来自Matlab背景,其中所有内容都被视为一个矩阵。在Matlab中,所有1D数据集都被视为行向量或列向量,并且索引被短路,因此指定单个索引将两者都视为1D列表。
Numpy本身并不处理矩阵,而是使用嵌套列表。列表列表与Matlab的矩阵具有相似的解释,但存在关键差异。例如,如果你只给它一个索引,Numpy就不会对你指的是哪个元素做任何假设,无论嵌套列表的深度如何,索引始终都是相同的。
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr)
>> [1 2 3 4]
print(arr[0])
>> 1
arr.shape = [4, 1]
print(arr)
>> [[1]
>> [2]
>> [3]
>> [4]]
print(arr[0])
>> [1]
arr.shape = [1, 4]
print(arr)
>> [[1 2 3 4]]
print(arr[0])
>> [1 2 3 4]
答案 2 :(得分:0)
从文档中引用:
形状:整数元组
形状元组的元素给出了长度 相应的数组维度。
所以,当你的形状像(4, )
时,意味着它的第一个维度中有4个元素。从你的例子开始就有意义吗?
相反,如果我们将形状(如你所说)设为(4, 1)
,则意味着第一个维度(轴= 1,在NumPy术语中)有4个元素和第二个维度(在NumPy术语中, axis = 0)中有1个元素,不是这种情况(对于1D数组)