numpy数组的排序,搜索,元素抽取

排序

numpy的排序函数

sort函数返回排序后的数组

lexsort函数根据键值的字典序进行排序

argsort函数返回数组排序后的下标

ndarray类的sort方法可以对数组进行原地排序

msort函数沿着第一个轴排序

sort_complex函数对复数按照先实部后虚部的顺序进行排序

Key_Function

lexsort函数根据键值的字典序进行排序

  将两个数组构成的元组, 分别取出对应下标的元素, 第一个数组的看做key, 第二个数组看做value

  然后按照value进行排序, 返回排序后的数组下标

  字典序就是按value进行排序

Code

import numpy as np
import datetime

def datestr2num(s):
    s = s.decode("utf-8")
    return datetime.datetime.strptime(s, "%d-%m-%Y").toordinal()

dates, closes = np.loadtxt("AAPL.csv", delimiter=‘,‘, usecols=(1, 5),
                           converters={1:datestr2num}, unpack=True)
indices = np.lexsort((dates, closes))
print(indices)
‘‘‘
[ 0 16  1 17 18  4  3  2  5 28 19 21 15  6 29 22 27 20  9  7 25 26 10  8 14
 11 23 12 24 13]
‘‘‘
l=[(datetime.date.fromordinal(int(dates[i])), closes[i]) for i in indices]
print(l)
‘‘‘
[(datetime.date(2011, 1, 28), 336.10000000000002),
(datetime.date(2011, 2, 22), 338.61000000000001),
(datetime.date(2011, 1, 31), 339.31999999999999),
(datetime.date(2011, 2, 23), 342.62),
(datetime.date(2011, 2, 24), 342.88),
(datetime.date(2011, 2, 3), 343.44),
(datetime.date(2011, 2, 2), 344.31999999999999),
(datetime.date(2011, 2, 1), 345.02999999999997),
(datetime.date(2011, 2, 4), 346.5),
(datetime.date(2011, 3, 10), 346.67000000000002),
(datetime.date(2011, 2, 25), 348.16000000000003),
(datetime.date(2011, 3, 1), 349.31),
(datetime.date(2011, 2, 18), 350.56),
(datetime.date(2011, 2, 7), 351.88),
(datetime.date(2011, 3, 11), 351.99000000000001),
(datetime.date(2011, 3, 2), 352.12),
(datetime.date(2011, 3, 9), 352.47000000000003),
(datetime.date(2011, 2, 28), 353.20999999999998),
(datetime.date(2011, 2, 10), 354.54000000000002),
(datetime.date(2011, 2, 8), 355.19999999999999),
(datetime.date(2011, 3, 7), 355.36000000000001),
(datetime.date(2011, 3, 8), 355.75999999999999),
(datetime.date(2011, 2, 11), 356.85000000000002),
(datetime.date(2011, 2, 9), 358.16000000000003),
(datetime.date(2011, 2, 17), 358.30000000000001),
(datetime.date(2011, 2, 14), 359.18000000000001),
(datetime.date(2011, 3, 3), 359.56),
(datetime.date(2011, 2, 15), 359.89999999999998),
(datetime.date(2011, 3, 4), 360.0),
(datetime.date(2011, 2, 16), 363.13)]
‘‘‘

对复数进行排序

复数包含实数部分和虚数部分

NumPy中有复数类型, 使用两个浮点数来表示复数.

Key_Function

sort_complex函数对复数进行排序, 按照先实部后虚部的顺序排序

Code

import numpy as np

np.random.seed(42)
# 随机数种子, 使用随机数种子, 不管参数如何, 都会生成固定顺序的随机数数组
# 参数只是起始随机数在随机数数组中的位置
# 同一个随机数种子, 反复取随机数, 肯定结果是不同的
# 可能因为所选取的随机数在随机数组中下标在递增
complex_numbers = np.random.random(5) + 1j * np.random.random(5)

print(complex_numbers)
‘‘‘
[ 0.37454012+0.15599452j  0.95071431+0.05808361j  0.73199394+0.86617615j
  0.59865848+0.60111501j  0.15601864+0.70807258j]
‘‘‘
print(np.sort_complex(complex_numbers))
‘‘‘
[ 0.15601864+0.70807258j  0.37454012+0.15599452j  0.59865848+0.60111501j
  0.73199394+0.86617615j  0.95071431+0.05808361j]
‘‘‘

numpy数组中搜索

argmax函数返回数组中最大值对应的下标

a = np.array([2, 4, 8])
np.argmax(a)
# 2

nanargmax函数, 会忽略NaN值

b = np.array([np.nan, 2, 4])
np.nanargmax(b)
# 2

argmin和nanargmin函数, 返回数组中最小值对应的下标

argwhere函数根据搜索条件搜索非零的元素, 并分组返回对应的下标

a = np.array([2, 4, 8])
np.argwhere(a <= 4)
‘‘‘
[[0]
 [1]]
‘‘‘

searchsort函数可以为指定的插入值寻找维持数组排序的索引位置

extract函数返回满足指定条件的数组元素

Key_Function

searchsorted函数, 返回一个索引位置, 将元素插入这个位置的话, 不改变原数组的有序性

Code

import numpy as np

a = np.arange(5)
print(a)
# [0 1 2 3 4]
indices = np.searchsorted(a, [-2, 7])
print(indices)
# [0 5]
print(np.insert(a, indices, [-2, 7]))
# [-2  0  1  2  3  4  7]

numpy中数组元素抽取

Key_Function

extract函数可以根据某个条件从数组中抽取元素.

  这个函数和where函数相似

nonzero函数专门用来抽取非零的数组元素

Code

import numpy as np

a = np.arange(7)
print(a)
# [0 1 2 3 4 5 6]
condition = (a % 2) == 0
print(condition)
# [ True False  True False  True False  True]
print(np.extract(condition, a)) # 指定了布尔条件从数组中抽取偶数元素
# [0 2 4 6]
print(np.nonzero(a))
# (array([1, 2, 3, 4, 5, 6]),)

原文地址:https://www.cnblogs.com/draven123/p/11421455.html

时间: 2024-10-06 08:26:36

numpy数组的排序,搜索,元素抽取的相关文章

9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

/** * 功能:给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 可以假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组被旋转过了,则寻找拐点. * @param a * @param left * @param right * @param x:要搜索的元素 * @return */ public static int search(int[] a,int left,int right,int x){ int mid=(

给object数组进行排序(排序条件是每个元素对象的属性个数)

从汤姆大叔的博客里看到了6个基础题目:本篇是第3题 - 给object数组进行排序(排序条件是每个元素对象的属性个数) 解题关键: 1.Array.sort的用法 2.object的属性数量的统计 解点1:Array.sort的用法 Array.sort可以为数组指定一个排序规则,一般用如下格式进行指定,代码如下: var arr = [10,6,0,4]; console.log( arr.sort() ); //按字符排序 0,10,4,6 console.log( arr.sort( fu

[经典面试题]排序数组中绝对值最小元素

[题目] 题目为: 有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. [分析] 给定数组是已经排好序的,且是升序,没有重复元素. 一个简单的思路,就是一次性遍历数组,求出数组的元素的绝对值的最小值,这样的时间复杂度为O(n). 但是,这样就浪费了题目的一个条件:数组是已经排好序的.所以,需要对原来的题目

【c语言】输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素

//旋转数组的最小数字 //题目:把一个数组最開始的若干个元素搬到数组的末尾.我们称之为数组的旋转. //输入一个递增排序的数组的一个旋转.输出旋转数组中的最小元素. //比如:数组{3.4,5,1,2}为{1,2.3.4.5}的一个旋转,最小元素是1. #include <stdio.h> #include <assert.h> int min_equ(int *src, int left, int right) { int i = 0; int ret = src[left];

输出一个为递增排序数组的旋转数组中的最小元素——8

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为数组{1, 2,3, 4, 5}的一个旋转,该数组的最小值为1. 当然了,将数组遍历一遍肯定能找出最小值,但其时间复杂度为O(N),效率是最低的,因此,应该有一种更高效的解决办法. 因为原数组是递增的,因此数组的第一个元素一定是最小值,而旋转之后,其最小值就会成为旋转的分界点,因此,查找一个旋转之后数组的最小值可以变成查找一个旋转数组的旋转点

排序 2:选择排序 - 不断选出剩余数组中最小的元素

选择排序过程:首先,选出数组中最小的元素,将它与数组中第一个元素交换,然后找出次小的元素,并将它与数组中第二个元素交换...直至整个数组排序完成.即通过不断选出剩余数组中最小的元素实现. 选择排序时间复杂度:O(N^2) 实现程序: void Selection_sort(Item a[], int l, int r) { for(int i = l; i < r; i++) //最后一个无需交换 { int min = i; for(int j = i + 1; j <= r; j++) {

【LeetCode-面试算法经典-Java实现】【026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)】

[026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for anot

让无序数组元素进行排序,排序完后将排序后元素对应的原先元素的位置输出

题目: 让无序数组元素进行排序,排序完后将排序后元素对应的原先元素的位置输出 (1)方法1 方法1:先将数组元素原先的对应位置记录在另一个数组中       并在进行选择排序的过程中,交换数组元素的同时也交换对应位置数组中的对应元素值 /* 选择法排序 并在排序后的数组元素在原先数组的对应位置输出 方法1:先将数组元素原先的对应位置记录在另一个数组中 并在进行选择排序的过程中,交换数组元素的同时也交换对应位置数组中的对应元素值 */ #include <iostream> using name

Codeforces 12D Ball 树状数组模拟3个元素的排序

题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<a