在numpy的ndarray类型中,似乎没有直接返回特定索引的方法,我只找到了where函数,但是where函数对于寻找某个特定值对应的索引很有用,对于返回一定区间内值的索引不是很有效,至少我没有弄明白应该如何操作
。下面先说一下where函数的用法吧。
(1)where函数的使用场景:
例如现在我生成了一个数组:
import numpy as np
arr=np.array([1,1,1,134,45,3,46,45,65,3,23424,234,12,12,3,546,1,2])
现在arr是一个含有18个元素的ndarray类型的数组,后面就用数组来称呼它吧。假如我想返回数组中所有元素值为3所对应的索引位置,那么通过where函数可以很轻松地完成。
print np.where(arr==3)
它会返回一个包含所有值为3对应的索引位置的元组,如下图:
可以看到在索引为5、9、14的地方所对应的元素值为3。通过这样的方式可以轻松达到目的。但是对于一定变化范围内的索引这样就不行了。下面的方法是自己想出来的折衷办法,比较笨,高手清喷。
(2)通过一个辅助的数组来解决一定范围内值索引的查找
我们建一个标识元素索引的数组,然后通过它来显示符合条件的元素对应的索引。还是刚才的数组,假如我现在要返回元素值在3到100之间值的索引。我可以生成一个和arr相同大小的数组,然后首先通过一次筛选找到大于3的元素对应索引的数组,继而在其中再次筛选,最终得到想要的结果。代码如下:
b=np.arange(len(arr))#生成和arr相同长度的数组
c=b[arr>3]#c存放的就是arr中大于3的元素对应的索引
#最后通过遍历c数组,选择3到100之间的值打印出来
for i in range(len(c)):
if arr[c[i]]<100:
print c[i],
下面看一下执行的效果:
可以看到程序将所有介于3和100之间的元素对应的索引值打了出来,如果想同时获得索引值和相应的元素,只需将上面的“print c[i]”, 替换为 “print c[i],arr[c[i]]”即可。
当然这种方法也适用于选择某个特定值对应的索引,例如我想找到所有3对应的位置,可以用print b[arr==3]即可打印出所有值为3的元素所对应的索引。其实不论怎么做,都是用到了数组进行关系运算后生成布尔数组,然后让数组中为True的地方进行显示。
当然还可以通过两次进行筛选,分别筛选出大于3的元素和小于100的元素对应的索引数组,然后两个数组做交集处理,在numpy中有一个intersect1d函数可以进行这样的运算,但是仍然麻烦。目前只能想到这些办法,不知道有哪位高手有更好的方法,欢迎大家一起交流一下。
在numpy的ndarray类型中,似乎没有直接返回特定索引的方法,我只找到了where函数,但是where函数对于寻找某个特定值对应的索引很有用,对于返回一定区间内值的索引不是很有效,至少我没有弄明白应该如何操作。下面先说一下where函数的用法吧。(1)where函数的使用场景:例如现在我生成了一个数组:import numpy as nparr=np.array([1,1,1
In [63]: data = np.
array
(['int','float','int','boolean','double','boolean'])
In [64]: data
Out[64]:
array
(['int', 'float', 'int', 'boolean', 'double', 'boolean'],
dtype='|S7')
In [65]: np.unique(data)
Out[65]:
array
(['
>
Numpy
是
Python
语言的一个扩充程序库。支持高级大量的维度
数组
与矩阵运算,此外也针对
数组
运算提供大量的数学函数库。
Numpy
内部解除了
Python
的 PIL (全局解释器锁),运算效率极好,是大量机器学习框架的基础库!
> 本实训需要学员掌握
Python
的基本知识,了解
Numpy
的数据类型以及
数组
数组
属性。
没有x和y参数,则以元组形式输出满足条件的列表
索引
。
3.np.argwhere(co
nd
ition)
Fi
nd
the i
nd
ices of
array
elements that are non-zero, grouped by element.
返回
结果不是元组,直接
返回
坐标
索引
。
Matlab
中
有一个函数叫做fi
nd
,可以很方便地寻找
数组
内特定元素的下标,即:Fi
nd
i
nd
ices a
nd
values of nonzero elements。
这个函数非常有用。比如,我们想计算图1
中
点Q(x0, y0)抛物线的最短距离。一个可以实施的
方法
是:计算出抛物线上所有点到Q点的距离,找到最小值,用fi
nd
函数找到最小值对应的下标,即M点横坐标和纵坐标对应的元素的下标,...
~~有一个神奇的事情,我看过很多人用a[a<3]这样的语法来筛选数据,但是每次我用的时候都会报错~
直到今天,我仔细调试了一下才发现,该语句是有适用范围的。
比如说:矩阵可以用,但列表不可以。
下面做几个小的演示。
l = [1,2,3,4,5] #测试列表
l[l<3] # 语句不会通过,会报错
l_n = np.
array
(l)
l_n[l_n<3] # 输出:[1, 2]
矩阵适用该语句l_n[l_n<3]
列表不适用
若要寻找列表
中
满足条
在进行物体检测的grou
nd
truth boxes annotations包围框坐标数据整理时,需要实现这样的功能:
numpy
里面,对于N*4的
数组
,要实现对于每一行,如果第3列和第1列数值相等或者第2列和第0列数值相等,就删除这一行,要
返回
保留下来的
numpy
数组
shape M*4
对于
numpy
数组
的操作要尽量避免for循环,因为
numpy
数组
支持布尔
索引
。
import
numpy
as np
a1=np.
array
(
[1,0,1,5]
a2=np.
array
(
[0,8,5,8]
center=np.ra
nd
om.ra
nd
int(0,10,size=(3,4)
numpy
库对多维
数组
有非常灵巧的处理方式,主要的处理
方法
有:
.reshape(shape) : 不改变
数组
元素,
返回
一个shape形状的
数组
,原
数组
不变
.resize(shape) : 与.reshape()功能一致,但修改原
数组
In [22]: a = np.arange(20)
#原
数组
不变
In [23]: a.reshape([4,5])
Out[23]:
array
([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [24]: a
NumPy
数组
的维数称为秩(rank),一维
数组
的秩为1,二维
数组
的秩为2,以此类推。在
NumPy
中
,每一个线性的
数组
称为是一个轴(axes),秩其实是描述轴的数量。比如说,二维
数组
相当于是一个一维
数组
,而这个一维
数组
中
每个元素又是一个一维
数组
。所以这个一维
数组
就是
NumPy
中
的轴(axes),而轴的数量——秩,就是
数组
的维数。
Numpy
库
中
的矩阵模块为
nd
array
对象,有很多属性:T,data, dtype,flags,flat,imag,real,size,
itemsize,nbytes,
nd
im,shape,strides,ctypes,base等等。
>>> import n
你可以通过
numpy
.where()
方法
来查找给定元素在
数组
中
的
索引
位置。例如,如果你有一个
numpy
的二维
数组
x,你可以使用以下代码来查找元素1的位置:
import
numpy
as np
x = np.
array
([[0, 1, 2], [3, 4, 5]])
i
nd
ex = np.where(x == 1)
print(i
nd
ex)
输出结果将是:
(
array
([0]),
array
([1]))
这意味着元素1位于
数组
x的第0行第1列(也就是第二个元素)。