Py学习  »  Python

Python-将numpy数组中的值移动到底部

Adan • 3 年前 • 1499 次点击  

我有一个numpy数组,看起来像这样:

可以通过更改“row_num”和“col_num”变量来更改大小

[[0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0.]]

在程序中,阵列可能如下所示:

[[0. 0. 0. 0. 0. 0. 0.]
 [2. 2. 2. 0. 2. 0. 0.]
 [1. 1. 1. 0. 1. 0. 0.]
 [2. 2. 2. 0. 2. 0. 0.]
 [1. 1. 2. 0. 2. 0. 0.]
 [2. 2. 0. 0. 0. 0. 0.]
 [1. 1. 0. 0. 0. 1. 0.]]

我想做一个函数,让数字向下移动,就像重力一样。因此,一旦函数运行,数组将如下所示:

[[0. 0. 0. 0. 0. 0. 0.]
 [2. 2. 0. 0. 0. 0. 0.]
 [1. 1. 0. 0. 0. 0. 0.]
 [2. 2. 2. 0. 2. 0. 0.]
 [1. 1. 1. 0. 1. 0. 0.]
 [2. 2. 2. 0. 2. 0. 0.]
 [1. 1. 2. 0. 2. 1. 0.]]

目前,我的函数中的代码如下所示:

    for cols in range(col_num):
    for rows in range(row_num-1):

        if board[rows][cols] == 0 and board[rows+1][cols] == 1:
            board[rows+1][cols] = 0
            board[rows][cols] = 1
            print('move down 1')
        elif board[rows][cols] == 0 and board[rows+1][cols] == 2:
            board[rows+1][cols] = 0
            board[rows][cols] = 2
            print('move down 2')

print语句正在工作,因此满足了条件,但它不会更改数组

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129222
 
1499 次点击  
文章 [ 3 ]  |  最新文章 3 年前
Shubham Sharma
Reply   •   1 楼
Shubham Sharma    3 年前

我们可以使用 argsort 若要获取索引,以使数字与底部对齐的方式对给定数组进行排序,请使用 np.take_along_axis 使用索引对数组进行排序

i = (arr != 0).argsort(axis=0)
np.take_along_axis(arr, i, axis=0)

array([[0., 0., 0., 0., 0., 0., 0.],
       [2., 2., 0., 0., 0., 0., 0.],
       [1., 1., 0., 0., 0., 0., 0.],
       [2., 2., 2., 0., 2., 0., 0.],
       [1., 1., 1., 0., 1., 0., 0.],
       [2., 2., 2., 0., 2., 0., 0.],
       [1., 1., 2., 0., 2., 1., 0.]])
nikeros
Reply   •   2 楼
nikeros    3 年前

您可以遵循以下方法:

import numpy as np
import pandas as pd

arr = np.array([[0., 0., 0., 0., 0., 0.,0.],
 [2.,2.,2.,0.,2.,0.,0.],
 [1.,1.,1.,0.,1.,0.,0.],
 [2.,2.,2.,0.,2.,0.,0.],
 [1.,1.,2.,0.,2.,0.,0.],
 [2.,2.,0.,0.,0.,0.,0.],
 [1.,1.,0.,0.,0.,1.,0.]])
 
arr_t = np.array(list(zip(*arr)))
print(np.array(list(zip(*[np.concatenate([line[line == 0], line[line =! 0]]) for line in arr_t]))))

输出

[[0. 0. 0. 0. 0. 0. 0.]
 [2. 2. 0. 0. 0. 0. 0.]
 [1. 1. 0. 0. 0. 0. 0.]
 [2. 2. 2. 0. 2. 0. 0.]
 [1. 1. 1. 0. 1. 0. 0.]
 [2. 2. 2. 0. 2. 0. 0.]
 [1. 1. 2. 0. 2. 1. 0.]]

转置二维数组,为每一行构建一个数组,将0的数组连接到所有其他数字,最后重新转置

Stefan B
Reply   •   3 楼
Stefan B    3 年前

实现所需输出的一种方法是使用python的内置语言 sort 方法

In [2]: data
Out[2]:
array([[0., 0., 0., 0., 0., 0., 0.],
       [2., 2., 2., 0., 2., 0., 0.],
       [1., 1., 1., 0., 1., 0., 0.],
       [2., 2., 2., 0., 2., 0., 0.],
       [1., 1., 2., 0., 2., 0., 0.],
       [2., 2., 0., 0., 0., 0., 0.],
       [1., 1., 0., 0., 0., 1., 0.]])

In [3]: np.array([sorted(column, key=bool) for column in data.T]).T
Out[3]:
array([[0., 0., 0., 0., 0., 0., 0.],
       [2., 2., 0., 0., 0., 0., 0.],
       [1., 1., 0., 0., 0., 0., 0.],
       [2., 2., 2., 0., 2., 0., 0.],
       [1., 1., 1., 0., 1., 0., 0.],
       [2., 2., 2., 0., 2., 0., 0.],
       [1., 1., 2., 0., 2., 1., 0.]])

这会在所有“零”之后对每个“非零”元素进行排序。