【问题标题】:Reshape numpy array having only one dimension重塑只有一维的numpy数组
【发布时间】:2018-06-07 15:05:21
【问题描述】:

为了从 list 获取一个 numpy 数组,我做了以下操作:

np.array([i for i in range(0, 12)])

得到:

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

然后我想从这个数组中创建一个 (4,3) 矩阵:

np.array([i for i in range(0, 12)]).reshape(4, 3)

我得到以下矩阵:

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

但如果我知道我将在初始 list 中有 3 * n 个元素,我该如何重塑我的 numpy 数组,因为以下代码

np.array([i for i in range(0,12)]).reshape(a.shape[0]/3,3)

导致错误

TypeError: 'float' object cannot be interpreted as an integer

【问题讨论】:

  • int(a.shape[0]/3) 应该这样做
  • a.reshape(-1, 3) 更通用
  • @nsaura 确实,你是对的
  • @Dav2357。如果你坚持走这条路,a.shape[0] // 3 会更优雅。

标签: python numpy reshape


【解决方案1】:

首先,np.array([i for i in range(0, 12)]) 是一种不太优雅的表达方式 np.arange(12)

其次,您可以将-1 传递给reshape 的一维(函数np.reshape 和方法np.ndarray.reshape)。在您的情况下,如果您知道总大小是 3 的倍数,请执行

np.arange(12).reshape(-1, 3)

得到一个 4x3 数组。来自文档:

一个形状维度可以是-1。在这种情况下,该值是从数组的长度和剩余维度推断出来的。

附带说明,您收到错误的原因是常规除法,即使对于整数,在 Python 3 中也会自动生成 floattype(12 / 3)float。您可以通过 a.shape[0] // 3 使用整数除法来使您的原始代码工作。话虽如此,使用-1 更方便。

【讨论】:

    【解决方案2】:

    您可以在.reshape 中使用-1。如果您指定一个维度,Numpy 将尽可能自动确定另一个维度[1]。

    np.array([i for i in range(0,12)]).reshape(-1, 3)
    

    [1]https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

    【讨论】:

    • 在此处使用numpy 时最好使用arange 然后使用列表理解
    猜你喜欢
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2017-06-10
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多