【问题标题】:For loop iteration over selected numbers (not using range)对于选定数字的循环迭代(不使用范围)
【发布时间】:2021-09-12 10:46:19
【问题描述】:

这是一个示例代码,但基本上我试图只选择一定范围的数字,比如 2、4 和 6,然后将 3D 随机值数组的第一个轴乘以前 2,然后乘以 4 和 6,然后存储新数组(其大小仍应为 3、30 和 10)。 我一直收到这个错误。我正在做的事情很简单,但我对我的 for 循环有什么问题感到困惑?我最初尝试了 np.array([2,4,6]) 但我仍然遇到同样的错误。

data = np.random.rand(3,30,10)

data_new = np.zeros((data.shape))

for i in [2,4,6]:
    data_new[i,:,:] = data[i]*i

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
/tmp/ipykernel_202420/2883607738.py in <module>
      4 
      5 for i in [2,4,6]:
----> 6     data_new[i,:,:] = data[i]*i
      7 

IndexError: index 4 is out of bounds for axis 0 with size 3

【问题讨论】:

    标签: python numpy jupyter


    【解决方案1】:

    data.shape[0] 显示first axis 的大小,这个大小是3,因此你不能调用data[4]data_new[4],如果你想要first axis,试试这个:

    for i in range(data.shape[0]):
        data_new[i] = data[i]*i
    

    或者如果你想选择 first axis 并乘以 2,4,6 ,...你需要像下面这样枚举:

    for idx, num in enumerate([2,4,6]):
        data_new[idx] = data[idx]*num
    

    【讨论】:

    • @wabash 欢迎老兄玩得开心:))))
    【解决方案2】:

    我想你的意思是:

    for i in [2,4,6]:
        data_new[:, :, i] = data[:, :, i]*i
    

    【讨论】:

      【解决方案3】:

      这应该可以解决问题:

      data = np.random.rand(3,30,10)
      
      data_new = data*np.array([2, 4, 6]).reshape(-1, 1, 1)
      

      例如:

      import numpy as np
      arr = np.ones((3, 2, 2))
      print(f'arr = \n{arr}')
      arr_new = arr*np.array([2, 4, 6]).reshape(-1, 1, 1)
      print(f'arr_new = \n{arr_new}')
      

      输出:

      arr = 
      [[[1. 1.]
        [1. 1.]]
      
       [[1. 1.]
        [1. 1.]]
      
       [[1. 1.]
        [1. 1.]]]
      arr_new = 
      [[[2. 2.]
        [2. 2.]]
      
       [[4. 4.]
        [4. 4.]]
      
       [[6. 6.]
        [6. 6.]]]
      

      【讨论】:

        猜你喜欢
        • 2014-12-03
        • 2017-03-20
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        • 2022-01-14
        • 1970-01-01
        相关资源
        最近更新 更多