【问题标题】:Dividing numpy array划分numpy数组
【发布时间】:2020-05-01 19:02:21
【问题描述】:

嗨,我正在尝试将一个 numpy 数组分成 2 部分,并通过一个循环,例如:

main_array.shape = (50, 400, 400, 3)
for i = 0:
 sub_array_1 would be equal to (0:10, 400, 400, 3)
 sub_array_2 would be equal to (10:50, 400, 400, 3)
for i = 1:
 sub_array_1 would be equal to (10:20, 400, 400, 3)
 sub_array_2 would be equal to (20:50, 400, 400, 3)

etc...

怎么做?

我使用以下代码,但得到了非常奇怪的结果:

i = 0
for k in range(1, k_fold+1):
        sub_array_1 = main_array[np.uint8(i):np.uint8(i+len(main_array)//5)]


        temp_0 = main_array[0:np.uint8(i)]
        temp_1 = main_array[np.uint8(i+len(main_array)//5):]
        sub_array_2 = np.concatenate((temp_0, temp_1), axis=0)

使用这个我确实获得了 2 个数组,但最终形状很奇怪。

我在这里做错了吗(我想是的)?

【问题讨论】:

  • 在索引时将标量整数转换为uint8 没有任何优势。
  • 您想在列表中收集值,使用alist=[]alist.append(new_array)np.concatenate 在循环中很慢,并且很难正确初始化。还要小心初始化列表的位置 - 它应该在循环之外完成。

标签: python arrays numpy loops concatenation


【解决方案1】:

试试这个:

import numpy as np
main_array = np.random.rand(50, 400, 400, 3)
k_fold = 5
step = main_array.shape[0] / k_fold
for i in range(0,k_fold - 1):
    sub_array_1 = main_array[int(step * i):int(step * (i + 1))]
    sub_array_2 = main_array[int(step * (i + 1)):]
    print("sub_array_1: {} -> {}".format(int(step * i),int(step * (i + 1))))
    print(sub_array_1.shape, sub_array_2.shape)
    print()

输出:

sub_array_1: 0 -> 10
(10, 400, 400, 3) (40, 400, 400, 3)

sub_array_1: 10 -> 20
(10, 400, 400, 3) (30, 400, 400, 3)

sub_array_1: 20 -> 30
(10, 400, 400, 3) (20, 400, 400, 3)

sub_array_1: 30 -> 40
(10, 400, 400, 3) (10, 400, 400, 3)

【讨论】:

  • 非常感谢@ExplodingGayFish。但是,我理解,如果 sub_array_1 必须始终为 (10,400,400,3),则 sub_array_2 应始终为 (40,400,400,3),但其中包含主数组的不同部分
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2021-11-06
  • 2016-10-14
  • 1970-01-01
相关资源
最近更新 更多