【问题标题】:Create a new dimension with a Desired Size than 1 in Numpy在 Numpy 中创建一个期望大小大于 1 的新维度
【发布时间】:2021-11-14 22:18:55
【问题描述】:

我在使用 Numpy 数组时想知道,如果我有一个大小为 (20,20) 的二维数组,并且我想添加一个特定大小的新维度,我该如何在 Python 中做到这一点。

每当我使用 np.expand_dims 或 np.newAxis 时,它总是会像这样 (20,20,1) 扩展我现有的数组,我希望它是 (20,20,10)。

请指导我,因为我是 NumPy 的新手,我在 Google 上的关键字搜索中找不到任何解决方案。

我正在从 Java 过渡到 Python。通知这一点,以便你们知道我在考虑 Java 时遇到了什么问题。

import numpy as np
a = np.arange(6).reshape((2, 3))
print('2d Array')
print(a.shape)

# create 3d Array with size (2,3,5) and not (2 , 3 ,1)

示例输入:

array([[0, 1, 2],
       [3, 4, 5]])

【问题讨论】:

  • 请包含您的代码的最小可重现示例,以便更容易回答您的问题
  • 新值是什么?初始副本?零点?
  • 可以是副本,也可以是不相同的。我试图弄清楚如何创建我喜欢的尺寸的新尺寸,因为 np.expandims 或 np.newAxis 总是创建尺寸为 1 的新尺寸。@mozway
  • 为了清楚起见,您能否将预期的输出添加到您的问题中?我希望我的回答是你所需要的;)
  • 您如何在java 中做到这一点?一些 for of 循环生成 10 个副本?

标签: python arrays numpy


【解决方案1】:
In [253]: a = np.arange(6).reshape(2,3)
In [254]: a
Out[254]: 
array([[0, 1, 2],
       [3, 4, 5]])

newaxis,正如您所注意到的那样添加了一个维度:

In [255]: a1 = a[...,None]
In [256]: a1.shape
Out[256]: (2, 3, 1)

因为broadcasting 这通常就足够了。例如 (2,3,1) 可以添加到 (5,) 以生成 (2,3,5)。 (5,) 自动扩展为 (1,1,5)。

In [257]: a2 = a1 + np.arange(5)
In [258]: a2.shape
Out[258]: (2, 3, 5)

repeat(或tile)可以扩展维度(任意维度):

In [261]: a1.repeat(5,2).shape
Out[261]: (2, 3, 5)

但总和与a1 相同。

In [262]: (a1.repeat(5,2)+np.arange(5)).shape
Out[262]: (2, 3, 5)

【讨论】:

  • 我想知道 OP 是否想要a = np.arange(400).reshape((20,20)); b = a[...,None]+np.zeros(10) ...
  • 意义重大,谢谢!
【解决方案2】:

你可以使用numpy.repeat:

b = np.repeat(a[:, :, None], 5, axis=2)

输出:

>>> b.shape
(2, 3, 5)

>>> b
array([[[0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1],
        [2, 2, 2, 2, 2]],

       [[3, 3, 3, 3, 3],
        [4, 4, 4, 4, 4],
        [5, 5, 5, 5, 5]]])

numpy.tile:

b = np.tile(a[:, :, None], 5)

输出:

array([[[0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1],
        [2, 2, 2, 2, 2]],

       [[3, 3, 3, 3, 3],
        [4, 4, 4, 4, 4],
        [5, 5, 5, 5, 5]]])

【讨论】:

    【解决方案3】:

    你想要的输出是什么?

    也许你的意思是:

    b = np.vstack(([[a] for i in range(5)]))
    

    输出:

    array([[[0, 1, 2],
            [3, 4, 5]],
    
           [[0, 1, 2],
            [3, 4, 5]],
    
           [[0, 1, 2],
            [3, 4, 5]],
    
           [[0, 1, 2],
            [3, 4, 5]],
    
           [[0, 1, 2],
            [3, 4, 5]]])
    

    形状是:(5,2,3) 如果这不是您的意思并且您想要 (2,3,5) 并重复任何元素 5 次,您可以使用:

      b= np.tile(a[: ,: ,np.newaxis],5)
    

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多