不同维度的数组相加减,如下一维减去二维的数组
>>> b
array([[0],
[1],
[2],
[3],
[4],
[5]])
>>> a
array([1, 2, 3, 4, 4, 5])
>>> a-b
array([[ 1, 2, 3, 4, 4, 5],
[ 0, 1, 2, 3, 3, 4],
[-1, 0, 1, 2, 2, 3],
[-2, -1, 0, 1, 1, 2],
[-3, -2, -1, 0, 0, 1],
[-4, -3, -2, -1, -1, 0]])
>>> x = np.array([[1,2,2],[2,3,5],[4,2,6],[9,12,4],[5,1,1]])
>>> x
array([[ 1, 2, 2],
[ 2, 3, 5],
[ 4, 2, 6],
[ 9, 12, 4],
[ 5, 1, 1]])
>>> x.shape
(5, 3)
>>> y = np.array([[1,2,3]])
>>> y
array([[1, 2, 3]])
>>> y.shape
(1, 3)
>>> x-y
array([[ 0, 0, -1],
[ 1, 1, 2],
[ 3, 0, 3],
[ 8, 10, 1],
[ 4, -1, -2]])
tile函数用法:http://jingyan.baidu.com/article/219f4bf7da4d8dde442d389e.html
tile(A,n),功能是将数组A重复n次,构成一个新的数组
>>> x-np.tile(y,(5,1))
array([[ 0, 0, -1],
[ 1, 1, 2],
[ 3, 0, 3],
[ 8, 10, 1],
[ 4, -1, -2]])
2.sort排序
参考网站:https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html,http://blog.csdn.net/sloanqin/article/details/50130253
>>> a = np.array([[1,4],[3,1],[12,0],[2,1],[4,2]])
>>> a
array([[ 1, 4],
[ 3, 1],
[12, 0],
[ 2, 1],
[ 4, 2]])
调用np.sort(axis=0),差不多是按列排序,如下例子,有两列,每列都是从小到大排序
>>> a.sort(0)
>>> a
array([[ 1, 0],
[ 2, 1],
[ 3, 1],
[ 4, 2],
[12, 4]])
若是调用np.sort(),差不多按行排序,如下例子,每一行,都是从小到大
>>> a.sort()
>>> a
array([[ 1, 4],
[ 1, 3],
[ 0, 12],
[ 1, 2],
[ 2, 4]])
3.array和list相减还是array,matrix和list相减还是matrix,但是相减的结果再平方,array不会报错误,而matrix会报错
原因在于array可以平方,而matrix只有方阵时才可以平方
如果若真想平方,则必须采用np.square()
>>> a = [1,2,3,4,5,6]
>>> b = [2,4,5,8,7,9]
>>> b = np.array(b)
>>> b-a
array([1, 2, 2, 4, 2, 3])
>>> (b-a)**2
array([ 1, 4, 4, 16, 4, 9])
>>> b = np.mat(b)
>>> b
matrix([[2, 4, 5, 8, 7, 9]])
>>> b-a
matrix([[1, 2, 2, 4, 2, 3]])
>>> (b-a)**2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/numpy/matrixlib/defmatrix.py", line 356, in __pow__
return matrix_power(self, other)
File "/usr/local/lib/python2.7/dist-packages/numpy/matrixlib/defmatrix.py", line 173, in matrix_power
raise ValueError("input must be a square array")
ValueError: input must be a square array
如果若真想平方,则必须采用np.square()
>>> np.square(b-a)
matrix([[ 1, 4, 4, 16, 4, 9]])
4.Python的星号(*、**)的作用
>>> a. 函数的可变参数
>>> b. 星号*把序列/集合解包(unpack)成位置参数,两个星号**把字典解包成关键字参数
5.numpy切片的一些小注意点
>>> a
array([ 1, 3, 4, 21, 35, 432, 5])
>>> a = a.reshape(len(a),1)
>>> a
array([[ 1],
[ 3],
[ 4],
[ 21],
[ 35],
[432],
[ 5]])
>>> a.shape
(7, 1)
>>> a[0:1] # 这个很重要
array([[1]])
>>> a[0:1,0] # 看看区别
array([1])
>>> a[0:1,:]
array([[1]])
>>> a[1]
array([3])
>>> a[1,0]
3
6.python列表生成式的注意点
--- 一般写列表生成式时,把要生成的元素放到前面,后面跟for循环,同时后面可以加上if判断
---但是有一种特殊情况,当if判断语句中有生成的元素,则if放在前面,如下面例子:
>>> L = ['Java' , 'C' , 'Swift' , 'Python' , 123]
>>> print [s.lower() if isinstance(s , str) else s for s in L ]
['java', 'c', 'swift', 'python', 123]
这样if放在后面,会发生错误
>>> print [s.lower() for s in L if isinstance(s , str) else s]
File "<stdin>", line 1
print [s.lower() for s in L if isinstance(s , str) else s]
^
SyntaxError: invalid syntax
而去掉else s,就需要把if放在后面了
>>> print [s.lower() for s in L if isinstance(s , str)]
['java', 'c', 'swift', 'python']
还有个特例需要注意:
>>> alist = [[(1, 2), (7, 5)], [(3, 9), (8, 5)], [(6, 1), (12, 90)]]
>>> [para for para in l for l in alist]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'l' is not defined
>>> [para for l in alist for para in l]
[(1, 2), (7, 5), (3, 9), (8, 5), (6, 1), (12, 90)]
>>> [para for para in [l for l in alist]]
[[(1, 2), (7, 5)], [(3, 9), (8, 5)], [(6, 1), (12, 90)]]
关键点就在于多了一个列表框[],因此才可以这样的顺序,一般列表生成式的嵌套循环顺序是从左至右的(→)
7.列表的深复制,Python列语言中函数参数是列表类型时,参数是按照引用方式传递的。因此可以如下这样做:
>>> a = [1,2,3,4]
>>> b = a[:]
>>> b
[1, 2, 3, 4]
>>> c = a
>>> a[0] = 98
>>> a
[98, 2, 3, 4]
>>> c
[98, 2, 3, 4]
# c随着a的值改变而改变,因为c和a指向同一个区域
>>> b
[1, 2, 3, 4]
# b并不改变,因为其新开辟了一块内存区域,使得b指向它
8.numpy的切片复制和深复制,以及布尔型索引
<1>由第7点可知,python的列表切片可以深复制,但是numpy的切片只能浅复制,如:
In [1]: a
Out[2]: [1, 2, 3, 4]
In [3]: a = np.array(a)# 开辟一块内存存储数组a的值
In [4]: a
Out[5]: array([1, 2, 3, 4])
In [6]: b = a[:] # 试图复制a的值,其实这只是引用
In [7]: b
Out[8]: array([1, 2, 3, 4])
In [9]: b[1]=99
In [10]: b
Out[11]: array([ 1, 99, 3, 4])
In [12]: a
Out[13]: array([ 1, 99, 3, 4]) # 注意看此处,a的值也改变了,说明这种方式只是引用,不是真的复制
<2>如果使用copy方法,就是深复制了,如:
In [16]: a
Out[16]: array([ 1, 99, 3, 4])
In [17]: c = a.copy()
In [18]: c
Out[18]: array([ 1, 99, 3, 4])
In [19]: c[0]=76
In [20]: c
Out[20]: array([76, 99, 3, 4])
In [21]: a
Out[21]: array([ 1, 99, 3, 4]) # c的改变并不影响到a的值
<3>再来看看布尔型索引,也不会改变原值,如:
In [21]: a
Out[21]: array([ 1, 99, 3, 4])
In [22]: d = a[a!=99] # 布尔型索引,得到a数组中不等于99的值,a!=99返回的是array([ True, False, True, True], dtype=bool)
In [23]: d
Out[23]: array([1, 3, 4])
In [24]: d[2] = 52 # 改变d数组中的值
In [25]: d
Out[25]: array([ 1, 3, 52])
In [26]: a
Out[26]: array([ 1, 99, 3, 4]) # 发现a数组并不受影响,可以知道布尔型索引会重新开辟一块内存再存储d数组,而不再是指向原来的a。
<4>布尔型索引还可以是多种条件的组合,通过(&或者是|来连接)如:
In [28]: a
Out[28]: array([ 1, 99, 3, 4])
In [29]: e = a[(a!=99) & (a!=3)]# 记得括号
In [30]: e
Out[30]: array([1, 4])
总结:一维数组的索引与切片和Python列表的功能类似,区别在于,数组切片是原始数组的视图,这意味着数据不会被复制,对视图的任何修改都会直接反映到原数组上。NumPy如此设计的目的是为了处理大数据,如果采取复制的方法可能产生性能和内存的问题。如果一定要复制可以使用copy方法显式的复制。通过布尔型索引选取数组中的数据,将总是创建副本,即使返回一模一样的数组。
9.numpy模块里的axis后面的值是指定一个轴做运算
10.numpy.newaxis
从字面上是插入新的维度的意思
>>> b = np.array([1, 2, 3])
>>> b[np.newaxis]
array([[1, 2, 3])
看一下转置的时候有什么区别
>>> np.transpose(b)
array([1, 2, 3])
>>> np.transpose(c)
array([[1],
[2],
[3]])
11.关于创建array数据时,类型的重要性!!
ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。
在创建数组时,要么手动指定数据类型,要么np.array会尝试为新建的这个数组推断出一个较为合适的数据类型。
若是把一个包含字符,整型数据的列表转化成array数组,并且没有手动指定数据类型,则会自动变成字符型array。
解决办法:
可以手动指定object类型,依然保持原因数据类型不变,因为这些字符型和整型本身都是object类型。
12.numpy数据类型转换时报出这样的错误:
---ValueError: setting an array element with a sequence.
---这表示数组内数据维度不统一,故无法转换数据类型。也就是出现这样的[[1,2],[3,4,5]]
13.一定范围内索引。
<方法1>可以生成一个和arr相同大小的数组,然后首先通过一次筛选找到大于3的元素对应索引的数组,继而对刚刚得到的数据再次筛选小于10的元素,最终得到想要的结果.
<方法2>还可以通过两次进行筛选,分别筛选出大于3的元素和小于100的元素对应的索引数组,然后两个数组做交集处理,在numpy中有一个intersect1d函数可以进行这样的运算。---numpy.intersect1d(x,y)就是计算x and y的公共元素
14.numpy最大值索引。
numpy.argmax(a, axis=None, out=None)
返回沿轴axis最大值的索引。
Parameters:
a : array_like
数组
axis : int, 可选
默认情况下,索引的是平铺的数组,否则沿指定的轴。
out : array, 可选
如果提供,结果以合适的形状和类型被插入到此数组中。
Returns:
index_array : ndarray of ints
索引数组。它具有与a.shape相同的形状,其中axis被移除。
例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17