【问题标题】:Numpy reshape with remainder throws error带有余数的 Numpy 重塑会引发错误
【发布时间】:2019-09-16 11:06:48
【问题描述】:

如何将此数组划分为长度为 3 的数组,并带有填充或未填充的余数(无关紧要)

>>> np.array([0,1,2,3,4,5,6,7,8,9,10]).reshape([3,-1])

ValueError: 无法将大小为 11 的数组重新整形为形状 (3,newaxis)

【问题讨论】:

  • 先填充它(比如np.pad),然后再整形。
  • 您知道将其填充到最接近的 3 倍的方法吗? (或 N)

标签: arrays python-3.x numpy reshape partitioning


【解决方案1】:
### Two Examples Without Padding

x = np.array([0,1,2,3,4,5,6,7,8,9,10])
desired_length = 3
num_splits = np.ceil(x.shape[0]/desired_length)

print(np.array_split(x, num_splits))

# Prints:
# [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10])]

x = np.arange(13)
desired_length = 3
num_splits = np.ceil(x.shape[0]/desired_length)

print(np.array_split(x, num_splits))

# Prints:
# [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10]), array([11, 12])]

### One Example With Padding

x = np.arange(13)
desired_length = 3
padding = int(num_splits*desired_length - x.shape[0])
x_pad = np.pad(x, (0,padding), 'constant', constant_values=0)

print(np.split(x_pad, num_splits))

# Prints:
# [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11]), array([12,  0,  0])]

【讨论】:

  • 这对于x 的所有长度都无法正常工作。例如,如果您使用x = np.arange(13),则第一个数组中将有 4 个元素。
  • 很好,应该是天花板而不是圆角。
【解决方案2】:

如果您想用零填充,ndarray.resize() 会为您执行此操作,但您必须自己弄清楚预期数组的大小:

import numpy as np

x = np.array([0,1,2,3,4,5,6,7,8,9,10])

cols = 3
rows = np.ceil(x.size / cols).astype(int)

x.resize((rows, cols))
print(x)

结果:

[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10  0]]

据我所知,这比列表理解方法快数百倍(请参阅我的其他答案)。

请注意,如果您在调整大小之前对x 进行任何操作,您可能会遇到“引用”问题。要么在x.copy() 上工作,要么将refcheck=False 传递给resize()

【讨论】:

  • 这可能是最好的填充解决方案,除非您不允许调整大小。
【解决方案3】:

如果你想避免用零填充,最优雅的方法可能是在列表理解中切片:

>>> import numpy as np
>>> x = np.arange(11)
>>> [x[i:i+3] for i in range(0, x.size, 3)]
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10])]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 2019-08-30
    • 2016-10-15
    • 2019-11-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多