当前位置: 首页 > 知识库问答 >
问题:

对随机值100x100数组进行排序,其中奇数索引行按升序排列,偶数行按降序排列

黄宏大
2023-03-14

我对这件事还不熟悉,很困惑。

import numpy as np

randomnums = np.random.randint(1,100, size=(100,100))

print("Unsorted 100x100 Array:")
print(randomnums) 

def bubbleSort(randomnums):
    indexLength = len(randomnums)
    
    for i in range(indexLength-1): #for all the values in the array
         
        for x in range(1,indexLength,2): #for all the odd indexs
            if randomnums[x] > randomnums[x+1]: #if number on left is larger
                
                randomnums[x],randomnums[x+1] = randomnums[x+1], randomnums[x] #swap the values to sort in ascending order
            
        else:
            for x in range(0,indexLength,2): #for all the even indexs
              if randomnums[x] < randomnums[x+1]:
                randomnums[x], randomnums[x+1] = randomnums[x+1], randomnums[x] #swap the values to sort in descending order

共有2个答案

易研
2023-03-14

可以使用np根据单个列的值对numpy数组进行排序。恩达雷。argsort()然后切片。在python中,如何根据第二列对2D数组(numpy.ndarray)进行排序?

既然您想分别对偶数行和奇数行进行排序,那么让我们先将它们分开:

even_rows = randomnums[::2, :]
odd_rows = randomnums[1::2, :]

然后,使用上面链接中的逻辑:

asc_order = even_rows[:, 0].argsort()
desc_order = odd_rows[:, 0].argsort()[::-1]


even_ordered_rows = even_rows[asc_order, :]
odd_ordered_rows = odd_rows[desc_order, :]

然后,设置原始数组中的值:

randomnums[::2, :] = even_ordered_rows
randomnums[1::2, :] = odd_ordered_rows

让我们把这些都放在一个函数中:

def sort_interleaved_in_place(arr, col):
    even_rows = arr[::2, :]
    odd_rows = arr[1::2, :]

    asc_order = even_rows[:, col].argsort()
    desc_order = odd_rows[:, col].argsort()[::-1]

    even_ordered_rows = even_rows[asc_order, :]
    odd_ordered_rows = odd_rows[desc_order, :]

    arr[::2, :] = even_ordered_rows
    arr[1::2, :] = odd_ordered_rows

从一个更小(10x3)的阵列开始:

>>> randomnums = np.random.randint(1, 100, (10, 3))
array([[ 7, 48, 86],
       [99, 76, 81],
       [61, 71, 33],
       [47, 41, 69],
       [35, 81, 41],
       [31,  7, 80],
       [77, 91, 14],
       [86, 38,  5],
       [73, 11, 60],
       [97, 59, 39]])

应用这个逻辑,我们得到这个结果:

>>> sort_interleaved_in_place(randomnums, 0)
>>> randomnums
array([[ 7, 48, 86],
       [99, 76, 81],
       [35, 81, 41],
       [97, 59, 39],
       [61, 71, 33],
       [86, 38,  5],
       [73, 11, 60],
       [47, 41, 69],
       [77, 91, 14],
       [31,  7, 80]])
甄志
2023-03-14

一开始,我认为行本身应该保持不变,并且只根据它们的索引重新排序(基本上只颠倒均匀索引的顺序),这没有太大的意义。

总之,这里有一个例子。请注意,每一个使用过的函数的文档都可以在[NumPy]:例程中找到。

代码00。py:

#!/usr/bin/env python

import sys

import numpy as np


def scramble(arr):
    ret = np.empty_like(arr)
    ret[1::2] = np.sort(arr[1::2])  # Odd
    ret[::2] = np.flip(np.sort(arr[::2]), axis=-1)  # Even
    return ret


def main(*argv):
    shp = (5, 5)  # @TODO - cfati: Change this according to your requirements
    arr0 = np.random.randint(0, np.prod(shp) - 1, size=shp)
    print("Original:")
    print(arr0)
    print("\nScrambled:")
    print(scramble(arr0))


if __name__ == "__main__":
    print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
                                                   64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    rc = main(*sys.argv[1:])
    print("\nDone.")
    sys.exit(rc)

笔记:

>

NP排序基于(默认情况下)最内侧(最后,-1)轴对行中的元素进行排序(仅按升序)

对于降序,行中已排序(升序)的元素必须翻转(同样,基于最里面的轴-这一次必须显式指定,默认情况下,它发生在所有轴上)

输出:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q071956865]> "e:\Work\Dev\VEnvs\py_pc064_03.09_test0\Scripts\python.exe" code00.py
Python 3.9.9 (tags/v3.9.9:ccb0e6a, Nov 15 2021, 18:08:50) [MSC v.1929 64 bit (AMD64)] 064bit on win32

Original:
[[23 14 14  5 10]
 [11 11 16  1  4]
 [10 22 17  2 14]
 [ 0  5 20  1 21]
 [16 13  5 21  5]]

Scrambled:
[[23 14 14 10  5]
 [ 1  4 11 11 16]
 [22 17 14 10  2]
 [ 0  1  5 20 21]
 [21 16 13  5  5]]

Done.
 类似资料:
  • 我有一个列表我想按升序排序这个列表,但首先是奇数,然后是偶数,就像这样: 无排序功能 我试过这个但我得到一个错误 谢谢你的回应

  • 我想按第三个和第一个元素对元组数组进行排序,因此我使用了以下代码: 我的问题是,在前面的例子中,我可以按第三个元素和第一个元素的升序排序,也可以按它们的降序排序(使用反向)。但是如何按第三个元素的升序和第一个元素的降序排序。 请在你的回答中考虑以下情况: 在这种情况下,我不知道内部数组的确切大小(取决于我读入该数组的文件模式),我想按侧中的所有项进行排序(一些升序和一些降序)。 编辑:看起来,我明

  • 我有数据。表中有大约300万行和40列。我希望在组内按降序对该表排序,如以下sql模拟代码: 数据中是否存在等效的方法。这张桌子可以吗?到目前为止,我必须将其分解为两个步骤: 这非常快,只需要几秒钟。 这一步需要更长的时间(5分钟)。 更新:有人评论要执行<code>X 我的方法是:setkey()然后是order(-Month) 我现在的问题是:如果我想按年、MemberId和一个又一个排序(年

  • 我试图建立一个方法,将排序一个二维数组的双打按列。基于所提供的规范,此方法也不应该采用长度不等的行的粗糙数组。我正在使用双[][]mdarray={{3.0, 4.0, 1.0, 8.0},{13.0, 2.0, 12.0, 9.0}测试这个 使用打印方法时,应将其显示为 3.0, 2.0, 1.0, 8.0, 13.0, 4.0, 12.0, 9.0, 使用单独的打印方法输出结果时,数组似乎没有

  • 我在学校的任务是创建一个程序,以升序排列数组的值。它几乎就在那里,但每当我输入“44 55 66 22 33 11 77 99 88 66”或它输出的任何数字 -858993460,11,22,33,44,55,66,66,77,88,或开头为负数 第一个数字到底怎么了?我是不是缺了什么? 我对C++很陌生,我不太明白这里的问题。如果有什么建议我可以用请告诉他们。 }

  • 考虑下面的哈希图: 具有诸如 我需要按值对hashmap进行降序排序,但如果值相等,则按键进行升序排序: 到目前为止,我试着分别按键排序,然后按值排序,但我不相信这种方法。除了创建更多的hashmaps之外,还有什么好方法呢?