【问题标题】:Looping over 1st dimension of 3D numpy array to create a smaller 3D array, via slicing通过切片循环 3D numpy 数组的第一维以创建更小的 3D 数组
【发布时间】:2014-09-07 01:47:49
【问题描述】:

这是我的第一篇文章,如果格式不正确,敬请见谅。我正在为我的硕士论文编写一些代码,其中我正在研究阿拉斯加海岸附近海冰的卫星图像。我正在使用的卫星仪器有 9 个摄像头,因此对于每个图像/波段,我有 9 个子数据集,我试图对其进行循环:NIR_data 是一个 3D numpy 数组,具有以下维度:9,512,256。我正在尝试创建一个新的 3D 数组,它是原始数组的 10x10 子集,由像素坐标 [256:266,112:122] 定义。因此,如果我只是为 1 个文件执行此操作,则代码将是:

NIR_BRF = NIR_data[i][256:266,112:122]

因此,尝试循环遍历我的 NIR_data 数组的第一个维度,这是我得到的最接近的维度:

for i,f in enumerate(NIR_data):
    NIR_BRF[i] = NIR_data[i][256:266,112:122]

其中 NIR_BRF 是一个预定义的空数组,测量值为 9,10,10。结果是一个 9,10,10 数组,但是这个数组中的所有值都是相同的,即循环没有工作。 我希望我已经解释得足够好,我知道这应该不会太难,但我正在努力让我的大脑正常工作。

非常感谢

亚历克斯

【问题讨论】:

    标签: python arrays numpy 3d netcdf


    【解决方案1】:

    这里不需要遍历 3D 数组。 请记住,当您想对数组元素执行一些操作时(可能是在获得较短的数组之后),那么您将需要对其进行迭代。当您想从现有的子数组中创建另一个子数组时,总会有一种方法可以摆脱在大多数情况下迭代..这里你只需要创建子数组(这里 python 的行为就像它的函数式编程语言) 这里可能的解决方法是使用语法

     [dim1_start:dim1_stop:dim1_step,dim2_start:dim2_stop:dim2_step,...dimn_start:dimn_stop:dimn_step]
    

    当你不给 start:stop 时,它假设一切,当你不给 step 时,它假设 step 为 1 个单位

    所以使用 NIR_BRF = NIR_data[:, 256:266, 112:122]

    【讨论】:

    • 太棒了,这对我来说是这样,只是为了清楚它是如何工作的:NIR_BRF = NIR_data[:,256:266,112:122]
    【解决方案2】:

    怎么样:

    NIR_BRF = NIR_data[:, 256:266, 112:122]
    

    这样就不需要预先分配数组了。

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多