python入门12:numpy库,ndarray,ndarray数组的创建与变换,数组的切片与索引,数组运算,多维数组提取,栅格图像变换

本文介绍了numpy库中的ndarray对象,包括其在数组创建、计算、维度变换、数据类型转换、列表转换以及数组索引、切片、运算、CSV文件读写和多维数据存取的应用。同时涵盖了图像处理部分,如PIL库的图像读取、像素操作和转换为灰度图像。
摘要由CSDN通过智能技术生成

前言

一维数据:列表与集合 列表:数据类型可以是不同的
数组:数据类型必须相同
二维数据/多维:一维/二维数据的组合,用列表
字典:键值对

numpy之——ndarray——N维数组对象

import numpy as np

ndarray:可以去掉运算之间的循环,使一维向量更像一个数据
ndarray:多维数组对象,由实际的数据和元数据两部分构成
要求所有元素类型相同,下标从0开始
np.array()生成一个ndarray数组,元素之间由空格分离
一些查看数组信息的函数后缀用例子来展示

ndarray元素类型

bool,True or False
intc,intp,ingt8.......
float.....
complex,复数

# 数组一般的计算方式,循环列表元素
def pysum():
    a = [1, 2, 3, 4]
    b = [2, 3, 4, 5]
    c = []
    for i in range(len(a)):
        c.append(a[i]**2 + b[i]**3)
    print(c)# [9, 31, 73, 141]
pysum()

# 如果使用numpy,则可以进行数组之间的计算(维度相同)
import numpy as np
def npsum():
    a = np.array([1, 2, 3, 4])
    b = np.array([2, 3, 4, 5])
    c = a**2 + b**3
    print(c)# 但是为什么生成的c没有逗号?[  9  31  73 141]
    print(type(c))# <class 'numpy.ndarray'>
npsum()    
[9, 31, 73, 141]
[  9  31  73 141]
<class 'numpy.ndarray'>
a = np.array([[1,2,3],[4,5,6]])
print(a.ndim)# 2,纵轴上的维数
print(a.shape)# (2,3),维度
print(a.size)# 6,元素数量
print(a.dtype)# int32,元素数据类型
print(a.itemsize)# 4,每个元素的大小,以字节为单位
2
(2, 3)
6
int32
4

ndarray数组的创建与变换

ndarray数组创建四种方式:默认创建的都是浮点数
ndarray数组维度变换的两种方式:保证总体元素数量不变
ndarray数组数据类型变换:astype()
ndarray数组向列表转换:.tolist()

# (1) a = np.array(列表/元组, dtype=np.float32)
b = np.array([1,3,5,7])
print(a)

# (2) a = np.arange/ones/zeros/full/eyes()
a = np.arange(10)
print(a)
a = np.ones((2,3,4))# 两个时间段,3行四列数据
print(a)

# (3) a = np.linspace/concentrate()
a = np.linspace(1,10,4)
print(a)
c = np.concatenate((a,b))
print(c)

# (1)a = np.reshape/resize()
# reshape()不改变原数组
[[1 2 3]
 [4 5 6]]
[0 1 2 3 4 5 6 7 8 9]
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]]
[ 1.  4.  7. 10.]
[ 1.  4.  7. 10.  1.  3.  5.  7.]

数组的索引与切片

索引:元素位置
切片:数组子集

# 一维数组
a = np.array([1,3,5,8,10])
print(a[0])

print(a[0:4:2])# 2为步长,0:4,实际包含0~3四个元素

# 多维数组
b = np.arange(24).reshape((2,3,4))
print(b)
print(b[1,2,3])# 第二个时间维度,第三行,第四列的元素
print(b[0,2,1])
print(b[-2,-3,-1])

print(b[:,0,3])
print(b[:,1:3,:])# 1:3实际指的是1和2两行
print(b[:,:,::3])# 可以理解为:和:3,步长为3
1
[1 5]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
23
9
3
[ 3 15]
[[[ 4  5  6  7]
  [ 8  9 10 11]]

 [[16 17 18 19]
  [20 21 22 23]]]
[[[ 0  3]
  [ 4  7]
  [ 8 11]]

 [[12 15]
  [16 19]
  [20 23]]]

数组的运算

数组运算:实际上是对数组内每个元素的运算
函数运算:数组本身并没有改变,只是生成了一个新的数组,超多函数,需要什么去搜

二元函数运算:将数组当作一个数来看待

import numpy as np
a = np.arange(24).reshape((2,3,4))
print(np.square(a))
[[[  0   1   4   9]
  [ 16  25  36  49]
  [ 64  81 100 121]]

 [[144 169 196 225]
  [256 289 324 361]
  [400 441 484 529]]]

CSV文件读取

CSV文件:逗号分隔值,但只能存储一维和二维数组
将数据读入存储为CSV文件: np.savetxt(frame,array,fmt):文件,存入文件的数组,写入文件的格式
将数据从CSV文件读入数组: np.loadtxt(文件,数据类型,分隔符,)

# 写入
import numpy as np
a = np.arange(100).reshape((5,20))
np.savetxt("a.csv", a, fmt="%d", delimiter=",")# 生成的文件就在jupyternotebook下
# ".1f"浮点型

# 读入
b = np.loadtxt("a.csv", delimiter=",")
print(b)
[[ 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():还原为数据,要与上个函数结合使用,知道数组的维度与元素类型
都要规定数据读取或者存储的类型才行

np.save(),np.load():以npy为扩展名

a = np.arange(100).reshape(5,10,2)
a.tofile("b.bat", sep=",", format="%d")
c = np.fromfile("b.bat", dtype=np.int, sep=",")
print(c)
c = np.fromfile("b.bat", dtype=np.int, sep=",").reshape(5,2,10)
print(c)


a = np.arange(100).reshape(5,5,4)
np.save("a.npy", a)
b = np.load("a.npy")
print(b)

numpy梯度函数

np.gradient(f):斜率呗就是,两侧值和单侧值计算是不同的
最外层梯度——指的是竖着的之间的比较;第二层梯度——横着内部之间的比较

查看图像信息

pillow库:PIL
图像:像素组成的二维矩阵,如例子所示 ,(高度,宽度,RGB值)

图像变换

读入图像—获得RGB值—修改后保存为新文件对RGB修改进行色彩任意的变换

from PIL import Image
import numpy as np
aim = np.array(Image.open("C:\\Users\\YMJ\\Pictures\\Saved Pictures\\2.jpg"))
print(aim.shape,aim.dtype)
print(aim)# 每个像素的高度,宽度,RGB的值


b = [255,255,255] - aim
print(b)
bim = Image.fromarray(b.astype("uint8"))
bim.save("C:\\Users\\YMJ\\Pictures\\Saved Pictures\\b.jpg")


cim = np.array(Image.open("C:\\Users\\YMJ\\Pictures\\Saved Pictures\\2.jpg").convert("L"))
# 灰度值
d = 255 - cim
print(d)
dim = Image.fromarray(d.astype("uint8"))
dim.save("C:\\Users\\YMJ\\Pictures\\Saved Pictures\\d.jpg")

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值