NumPy(4)数组数学操作与复制、排序

保留初心,砥砺前行

NumPy官方网站

NumPy Tutorial

先定义两个NumPy array

A = np.array([[1, 2, 3],
              [2, 3, 4]]).astype(np.float32)
B = np.array([[2, 3, 4],
              [3, 4, 5]]).astype(np.float32)
  • 算数运算:

    Subtraction

print A - B
print np.subtract(A, B)
[[-1. -1. -1.]
 [-1. -1. -1.]]
[[-1. -1. -1.]
 [-1. -1. -1.]]

Addition

print A + B
print np.add(A, B)
[[ 3.  5.  7.]
 [ 5.  7.  9.]]
[[ 3.  5.  7.]
 [ 5.  7.  9.]]

Division

print A / B
print np.divide(A, B)
[[ 0.5         0.66666669  0.75      ]
 [ 0.66666669  0.75        0.80000001]]
[[ 0.5         0.66666669  0.75      ]
 [ 0.66666669  0.75        0.80000001]]

Multiplication,只是对应的元素相乘,并不是真正的矩阵乘法

print A * B
print np.multiply(A, B)
[[  2.   6.  12.]
 [  6.  12.  20.]]
[[  2.   6.  12.]
 [  6.  12.  20.]]

dot product 点积,这是真正的矩阵乘法,与上边的操作相对应

print np.dot(A, np.transpose(B))
print np.transpose(B)
[[ 20.  26.]
 [ 29.  38.]]
[[ 2.  3.]
 [ 3.  4.]
 [ 4.  5.]]

把每个元素nij变成以e为底,nij为指数的形式——enij

print np.exp(A)
[[  2.71828175   7.38905621  20.08553696]
 [  7.38905621  20.08553696  54.59814835]]

把每个元素开方

print np.sqrt(A)
[[ 1.          1.41421354  1.73205078]
 [ 1.41421354  1.73205078  2.        ]]
  • 比较:

两个矩阵之间的对应元素大小的比较

print A == B
print A < B
print A < 3
[[False False False]
 [False False False]]
[[ True  True  True]
 [ True  True  True]]
[[ True  True False]
 [ True False False]]

两个矩阵在矩阵层面的比较

print np.array_equal(A, B)
False
  • 聚合函数:

这里包含求所有元素(或按照行或列划分的)和,所有元素(或按照行或列划分的)中的最大最小值,元素累加,平均数,中位数,相关系数,标准差等。

关于相关系数:相关表和相关图可反映两个变量之间的相互关系及其相关方向,但无法确切地表明两个变量之间相关的程度。于是,著名统计学家卡尔·皮尔逊设计了统计指标——相关系数(Correlation coefficient)。相关系数是用以反映变量之间相关关系密切程度的统计指标。

```

print np.min(A) #A中的最小值
print np.sum(A), np.sum(A, axis=1) #A所有元素求和,横轴元素求和
print np.max(A, axis=1) #每一个横轴的最大值
print np.cumsum(A), np.cumsum(A, axis=1) #按元素累加,每一个横轴按元素累加
print np.mean(A) #求所有元素的平均值
print np.median(A) #中位数
print np.corrcoef(A) #相关系数
print np.std(A) #标准差

其中,np.cumsum累加可能不是很清晰,看下边的例子:

print np.cumsum(A), np.cumsum(A, axis=1)
[ 1. 3. 6. 8. 11. 15.] [[ 1. 3. 6.]
[ 2. 5. 9.]]

可以看出np.cumsum(A)的每一个元素是A中这个位置的元素(包括自身)累加到第一个元素的值。


- ###排序:
np.sort()
Return a sorted copy of an array.
>`Parameters:   `
***a*** : array_like
Array to be sorted.
**axis **: int or None, optional
Axis along which to sort. If None, the array is flattened before sorting. The default is -1, which sorts along the last axis.
**kind** : {‘quicksort’, ‘mergesort’, ‘heapsort’}, optional
Sorting algorithm. Default is ‘quicksort’.
**order** : str or list of str, optional
`Returns:   `
**sorted_array** : ndarray
Array of the same type and shape as *a*.

    ```
C = np.array([1,3,5,2,34,5,6,3,5,8])                                          
print np.sort(C)                    
 [1  2  3  3  5  5  5  6  8 34]```
- ###复制:
####copy
首先需要注意的是,B = A并不意味着copy了一个与A相同的array并赋值给B,而是B也指向了A指向的那个array,如果此时对A进行操作,则B也会产生同样的变化,因为它们本来就是同一个array。

C = np.array([1, 2, 3, 4, 6])
D = C.copy()

这是deep copy ,可以看做是真正的copy,如上代码所示,将C中的内容复制到D中,C与D虽然内容完全一样,但是是两个array。
####view
>Different array objects can share the same data. The view method creates a new array object that looks at the same data.

    事实上,没有任何数据类型是固定的,主要取决于如何看待这片数据的内存区域。
在numpy.ndarray.view中,提供对内存区域不同的切割方式,来完成数据类型的转换,而无须要对数据进行额外的copy,来节约内存空间。
我自己的理解是,view生成的array和被view的array的data实际上指向的是同一块内存,也就是相同的一块数据。不同点在于view可以表示成不同的shape或type。这样比copy节省内存。
接下来看示例就可以明白个大概。

C = np.array([1, 2, 3, 4, 6])
D = C.view()
print D is C
print D.base is C
False
True

C = np.array([1, 2, 3, 4, 6])
D = C.view(np.float32)
print C
print D

[1 2 3 4 6]
[ 1.40129846e-45 0.00000000e+00 2.80259693e-45 0.00000000e+00
4.20389539e-45 0.00000000e+00 5.60519386e-45 0.00000000e+00
8.40779079e-45 0.00000000e+00]

他们其实共享的是同一个内存中的同一个数据,只是表示出来的type不同而已。

C = np.array([1, 2, 3, 4, 6])
D = C.view()
C[0] = 3
print C
print D

[3 2 3 4 6]
[3 2 3 4 6]

当array C中的某个元素变化,可以看到array D中的相应元素也发生了变化。

好了,以上就是今天的全部内容了,欢迎讨论指正。

>[相关链接:NumPy(1)简介,基础属性,数组创建(ones,zeros,empty,arange,linespace)](http://www.jianshu.com/p/5472800d7c36)
>[相关链接:NumPy(2)reshape,dot,flat](http://www.jianshu.com/p/949b1f8750a9)
>[相关链接:NumPy(3)full,eye,empty,random](http://www.jianshu.com/p/973bceed75c5)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,332评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,930评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,204评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,348评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,356评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,447评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,862评论 3 394
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,516评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,710评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,518评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,582评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,295评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,848评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,881评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,121评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,737评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,280评论 2 341

推荐阅读更多精彩内容