Numpy reshape在方阵上的行为不同

lmvvr0a8  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(257)

我有以下数据:

weights = [
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
]

len_models = len(weights)
len_layers = len(weights[0])

如果我尝试这样重塑数据:x = np.reshape(weights, (len_layers, len_models)),我得到一个错误:
无法将大小为30的数组整形为形状(2,5)
但是,如果权重具有以下值:

weights = [
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
]

重塑操作有效。
为什么会这样呢?

taor4pac

taor4pac1#

你应该把形状看成np.arrays

weights = np.array([
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3])]),
])
weights.shape # (5,2,3)
weights.dtype # dtype('int32')

为什么整形到(5,2)是不可能的,现在应该很明显了。
第二种情况:

weights = np.array([
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
    np.array([np.array([1, 2, 3]), np.array([1, 2, 3, 4])]),
])
weights.shape # (5,2)
weights.dtype # dtype('O')

第三维具有不同的长度(3和4),这创建了将第三维视为“一个”斑点的对象阵列。这也由警告指示:
VisibleDeprecationWarning:不赞成从不规则的嵌套序列(即具有不同长度或形状的列表或元组或ndarray的列表或元组)创建ndarray。如果你打算这样做,你必须在创建ndarray时指定'dtype=object'。np.array([np.array([1,2,3]),np.array([1,2,3,4])])

相关问题