Py学习  »  Python

Python,numpy如何基于每行中的值复制数组中的行

oaktree • 4 年前 • 1478 次点击  

我想要重复的行 numpy 基于每行中第一个项的数值的数组。因此,如果值为1,则该行不会重复,但如果值为3,则该行将被表示3次。我试着用 np.repeat np.tile 但我不知道他们是不是合适的工具,我还没想好是否有办法做到这一点。

下面是我随机生成的数组:

[[[3 1 3 1 2]
  [4 4 4 2 0]
  [3 4 4 4 0]
  [1 4 3 3 0]]

 [[4 2 0 2 1]
  [2 1 2 0 3]
  [4 1 3 4 3]
  [2 3 2 0 0]]]

我的目标是:

[[[3 1 3 1 2]
  [3 1 3 1 2]
  [3 1 3 1 2]
  [4 4 4 2 0]
  [4 4 4 2 0]
  [4 4 4 2 0]
  [4 4 4 2 0]
  [3 4 4 4 0]
  [3 4 4 4 0]
  [3 4 4 4 0]
  [1 4 3 3 0]]

 [[4 2 0 2 1]
  [4 2 0 2 1]
  [4 2 0 2 1]
  [4 2 0 2 1]
  [2 1 2 0 3]
  [2 1 2 0 3]
  [4 1 3 4 3]
  [4 1 3 4 3]
  [4 1 3 4 3]
  [4 1 3 4 3]
  [2 3 2 0 0]
  [2 3 2 0 0]]]

这是我目前掌握的密码

array = np.random.randint(5, size = (2, 4,5))

for a in array:
    for b in a:
        array = np.tile(a, (b[0],1))

如果我打印 b[0] ,我可以得到每个值。我想用这些值来复制每一行。

3
4
3
1
4
2
4
2

所以我想我可以循环遍历这些值,然后将每一行乘以相应的值来添加新行,但是我的结果一次只能重复第二个数组。

[[4 2 0 2 1]
 [2 1 2 0 3]
 [4 1 3 4 3]
 [2 3 2 0 0]
 [4 2 0 2 1]
 [2 1 2 0 3]
 [4 1 3 4 3]
 [2 3 2 0 0]]

我哪里做错了?我不应该用 np.瓷砖 ?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52494
 
1478 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Chris
Reply   •   1 楼
Chris    5 年前

使用 numpy.repeat 具有 np.arange :

import numpy as np

    arr = np.array([[[3, 1, 3, 1, 2],
  [4, 4, 4, 2, 0],
  [3, 4, 4, 4, 0],
  [1, 4, 3, 3, 0]],
 [[4, 2, 0, 2, 1],
  [2, 1, 2, 0, 3],
  [4, 1, 3, 4, 3],
  [2, 3, 2, 0, 0]]])

arr2d = np.vstack(arr)
dup = arr2d[np.repeat(np.arange(arr2d.shape[0]), arr2d[:,0])]
np.split(dup, np.cumsum(np.sum(np.split(arr2d[:,0], arr.shape[0]), 1)))[:-1]

输出:

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

由于2d数组并不总是具有相同的形状,因此在大多数情况下,它将生成数组列表。这样的不一致并没有得到很好的处理 numpy .

在这种情况下,您可以简单地使用 itertools.repeat 具有 list 理解力。(尽管它看起来与@gmds的答案非常相似)

鉴于 l :

import itertools

l = [[[3, 1, 3, 1, 2], [4, 4, 4, 2, 0], [3, 4, 4, 4, 0], [1, 4, 3, 3, 0]],
 [[4, 2, 0, 2, 1], [2, 1, 2, 0, 3], [4, 1, 3, 4, 3], [2, 3, 2, 0, 0]]]

[[j for i in sub for j in itertools.repeat(i, i[0])] for sub in l]

输出:

[[[3, 1, 3, 1, 2],
  [3, 1, 3, 1, 2],
  [3, 1, 3, 1, 2],
  [4, 4, 4, 2, 0],
  [4, 4, 4, 2, 0],
  [4, 4, 4, 2, 0],
  [4, 4, 4, 2, 0],
  [3, 4, 4, 4, 0],
  [3, 4, 4, 4, 0],
  [3, 4, 4, 4, 0],
  [1, 4, 3, 3, 0]],
 [[4, 2, 0, 2, 1],
  [4, 2, 0, 2, 1],
  [4, 2, 0, 2, 1],
  [4, 2, 0, 2, 1],
  [2, 1, 2, 0, 3],
  [2, 1, 2, 0, 3],
  [4, 1, 3, 4, 3],
  [4, 1, 3, 4, 3],
  [4, 1, 3, 4, 3],
  [4, 1, 3, 4, 3],
  [2, 3, 2, 0, 0],
  [2, 3, 2, 0, 0]]]
gmds
Reply   •   2 楼
gmds    5 年前

由于无法保证执行此操作后三维源阵列中的原始二维子阵列将具有相同的形状,因此通常不能将它们重新堆叠为三维阵列。

你可以得到一个 list 数组的 np.repeat 通过将每个2D数组的第一列作为重复次数传递。然后,它将对每一行重复相应的次数:

from pprint import pprint

result = ([np.repeat(a[i], a[i, :, 0], axis=0) for i in range(a.shape[0])])

pprint(result)

输出:

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