程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python數據分析與展示(二)

編輯:Python

學習視頻鏈接:Python數據分析與展示_北京理工大學_哔哩哔哩_bilibili    P11-P20

數據存取與函數

一、CSV文件

CSV(Comma-Separated Value,逗號分隔值),CSV是一種常見的文件格式,用來存儲批量數據。

CSV文件只能有效存儲一位和二維數組。

寫入數組:

import numpy as np
np.savetxt(frame,array,fmt='%.18e',delimiter=None)
# frame:文件、字符串或產生器,可以是.gz或.bz2的壓縮文件
# array:存入文件的數組
# fmt:寫入文件的格式,例如%d %.2f %.18e
# delimiter:分割字符串,默認是任何空格
例子:
import numpy as np
a=np.arange(100).reshape((5,20))
np.savetxt('a.csv',a,fmt='%d',delimiter=',',header="實驗數組",encoding='utf-8')
# 實驗數組
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39
40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59
60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99

讀出數組:

import numpy as np
np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False)
# frame:文件、字符串或產生器,可以是.gz或.bz2的壓縮文件
# dtype:數據類型,可選
# delimeter:分割字符串,默認是空格
# unpack:如果True,讀入屬性分別寫入不同變量

例子:

import numpy as np
a=np.loadtxt('a.csv',dtype=np.float,delimiter=',')
print(a)
'''
[[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
18. 19.]
[20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
38. 39.]
[40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.
58. 59.]
[60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77.
78. 79.]
[80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97.
98. 99.]]
'''
二、多維數據的的存取

寫入數組:

import numpy as np
np.tofile(frame,sep='',format='%s')
# frame:文件、字符串
# sep:數據分割字符串,如果是空串,寫入文件為二進制
# format:寫入數據的格式

例子:

import numpy as np
a=np.arange(100).reshape((5,20))
a.tofile('a.dat',sep=',',format='%d')
a.tofile('b.dat',format='%d') #此時寫入的是二進制格

讀出數組:

np.fromfile(frame,dtype=float,count=-1,sep='')
# frame:文件、字符串
# dtype:讀取的數據類型
# count:讀入元素的個數,-1表示讀入整個文件
# sep:數據分割字符串,如果是空串,寫入文件為二進制

例子:

import numpy as np
a=np.fromfile('a.dat',dtype=np.int,sep=',').reshape((5,20))
print(a)
'''
[[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
[20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99]]
'''

注意:該方法需要讀取時知道存入文件時數組的維度和元素類型,a.tofile()和np.fromfile()需要配合使用,可以通過元數據文件來存儲額外信息

三、多維數組的便捷文件存取

import numpy as np
np.save(fname,array) #np.savez(frame,array)
# fname:文件名,以.npy為擴展名,壓縮擴展名為.npz
# array:數組變量
np.load(fname)
# fname:文件名,以.npy為擴展名,壓縮擴展名為.npz
例子:
import numpy as np
a=np.arange(100).reshape((2,5,10))
np.save('a.npy',a)
a=np.load('a.npy')
print(a)
'''
[[[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 23 24 25 26 27 28 29]
[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]]
[[50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69]
[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]]]
'''
四、NumPy的隨機函數

NumPy的隨機函數子庫是random庫

 例子:

 

例子:

例子:

五、NumPy統計函數

例子:

例子:

六、NimPy的梯度函數

  • np.gradient(f):計算數組f元素的梯度,當f為多維時,返回每個維度梯度
  • 梯度:連續值之間的變化率,即斜率。XY坐標軸連續三個X坐標對應的Y軸值,其中b的梯度是:(c-a)/2

例子:

筆記:python數據分析與展示(二) - 元騎鯨 - 博客園

筆記:數據分析與展示——NumPy數據存取與函數 - Python學習者 - 博客園 

圖像的手繪效果(圖像的數組表示) 

圖像的RGB色彩模式

圖像一般使用RGB色彩模式,即每個像素點的顏色由紅(R)、綠(G)、藍(B)組成。

RGB三個顏色通道的變化和疊加得到各種顏色,取值都為0-255。RGB形成的顏色包括了人類視力所能感知的所有顏色。

PIL(Python Image Library)庫

PIL庫是一個具有強大圖像處理能力的第三方庫。在命令行下的安裝方法:

pip install pillow

from PIL import Image

Image是PIL庫中代表一個圖像的類(對象)

圖像是一個由像素組成的二維矩陣,每個元素是一個RGB值。

范例:將數組轉化為ndarray數組

In [1]: from PIL import Image
In [2]: import numpy as np
In [3]: im = np.array(Image.open("E:/tiger.jpg"))
In [4]: print(im.shape,im.dtype)
(435, 428, 3) uint8

圖像是一個三維數組,維度分別是高度、寬度和像素RGB值。

圖像的變換

讀入圖像後,獲得像素RGB值,修改後保存為新的文件。

范例:修改圖像並另存

In [5]: b = [255,255,255] - im
In [6]: new_im = Image.fromarray(b.astype('uint8'))
In [7]: new_im.save("E:/tiger1.jpg")
In [8]: a = np.array(Image.open("E:/tiger.jpg").convert('L')) # 使用灰度表示圖像
In [9]: b = 255 - a
In [10]: im = Image.fromarray(b.astype('uint8'))
In [11]: im.save("E:/tiger2.jpg")
In [12]: c = (100/255)*a +150 # 區間變換
In [13]: im = Image.fromarray(c.astype('uint8'))
In [14]: im.save("E:/tiger3.jpg")
In [15]: d = 255 * (a/255)**2 # 像素平方
In [16]: im = Image.fromarray(d.astype('uint8'))
In [17]: im.save("E:/tiger4.jpg")

 

“圖像的手繪效果”實例分析

手繪效果特征:

  • 黑白灰色
  • 邊界線條較重
  • 相同或相近色彩趨於白色
  • 略有光源效果

圖像手繪效果實現代碼:

 

from PIL import Image
import numpy as np
a = np.asarray(Image.open('E:/tiger.jpg').convert('L')).astype('float')
depth = 10. # (0-100)
grad = np.gradient(a) # 取圖像灰度的梯度值
grad_x, grad_y = grad # 分別取橫縱圖像梯度值
grad_x = grad_x * depth / 100.
grad_y = grad_y * depth / 100.
A = np.sqrt(grad_x **2 + grad_y **2 + 1.)
uni_x = grad_x / A
uni_y = grad_y / A
uni_z = 1. / A
vec_el = np.pi / 2.2 # 光源的俯視角度,弧度值
vec_az = np.pi / 4. # 光源的方位角度,弧度值
dx = np.cos(vec_el) * np.cos(vec_az) # 光源對x軸的影響
dy = np.cos(vec_el) * np.sin(vec_az) # 光源對y軸的影響
dz = np.sin(vec_el) # 光源對z軸的影響
b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) # 光源歸一化
b = b.clip(0,255)
im = Image.fromarray(b.astype('uint8')) # 重構圖像
im.save('E:/tiger0.jpg')

 

筆記鏈接:數據分析與展示——圖像手繪效果實現 - Python學習者 - 博客園

 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved