W3Schools-NumPy系列2

NumPy数据类型

简写 名称 解释
i integer 整数型
b boolean 布尔型
u unsigned integer
f float 浮点型
c complex float
m timedelta
M datetime
O object
S string 字符型
U unicode string
V fixed chunk of memory for the other type

NumPy中一些数据类型操作

##利用dtype查看数据类型
import numpy as np
arr=np.array([1,2,3,4])
print(arr.dtype)#结果为int64
arr=np.array(['a','b','c'])
print(arr.dtype)#结果为<U1

#利用dtype指定数据类型
arr=np.array([1,2,3,4],dtype='S')
print(arr.dtype)#结果为|S1

#用astype更改数据类型
newarr=arr.astype('i')#将arr数据类型更改为整数型然后重新复制给new.arr,newarr与arr的内容一致但数据类型不同
print(newarr.dtype)#结果为int32

NumPy中的copy和view

copy是复制一个array,复制后新旧array无关

view是建立软链接,新旧array绑定

用base属性可查看某个array是copy还是view

import numpy as np
arr=np.array([1,2,3,4])
arr1=arr.copy()
print(arr1)#结果为[1 2 3 4]
arr2=arr.view()
print(arr2)#结果为[1 2 3 4]

arr[1]=100
print(arr)#结果为[1 100 3 4]
print(arr1)#结果为[1 2 3 4]
print(arr2)#结果为[1 100 3 4]

##用bash查看array为copy还是view,如果为copy则返回None,如果为view则打印array
print(arr.base)#结果为None
print(arr1.base)#结果为None
print(arr2.base)#结果为[1 100 3 4]

NumPy Array Shape

NumPy中array的shape是指每个维度的元素个数,利用shape获取array的shape,利用reshape可改变array的shape

import numpy as np
arr1=np.array([1,2,3,4,5,6,7,8,9,10,11,12])
print(arr1.shape)#结果为(12,)
arr2=np.array([[1,2,3,4,5,6],[7,8,9,10,11,12]])
print(arr2.shape)#结果为(2,6)
arr3=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(arr3.shape)#结果为(2,2,3)

#shape结果返回一个包含每个维度元素个数的元祖,第一个数字代表array的第一维度种元素个数,array中第一个维度是指最外层维度,所有维度数的乘积为array中总元素数。

#利用reshape改变array的shape
arr1=np.array([1,2,3,4,5,6,7,8,9,10,11,12])

#将1-D array变为2-D array,reshape中指定2-D array的shape
arr2=arr1.reshape(2,6)
print(arr2)#结果为[[1 2 3 4 5 6] [7 8 9 10 11 12]]

#将1-D array变成3-D array,reshape中指定3-D array的shape
arr3=arr1.reshape(2,2,3)
print(arr3)#结果为[[[ 1  2  3] [ 4  5  6]] [[ 7  8  9] [10 11 12]]]

#将array直接压扁为1-D array
newarr=arr3.reshape(-1)
print(newarr)#结果为[1 2 3 4 5 6 7 8 9 10 11 12]

NumPy Array Iterating数组迭代

用for在循环访问数组中的元祖,对于N维数组,for循环可以直接访问N-1层维度的每个元素。

##NumPy Array Iterating基础用法
import numpy as np
arr1=np.array([1,2,3,4,5,6,7,8,9,10,11,12])
for a in arr1:
    print(a)#结果为1 2 3 4 5 6 7 8 9 10 11 12

arr2=np.array([[1,2,3,4,5,6],[7,8,9,10,11,12]])
for a in arr2:
    print(a)
    for b in a:
        print(b)#结果为[1 2 3 4 5 6] 1 2 3 4 5 6 [7 8 9 10 11 12] 7 8 9 10 11 12

arr3=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
for a in arr3:
    print(a)
    for b in a:
        print(b)
        for c in b:
            print(c)
#结果为[[1 2 3] [4 5 6]] [1 2 3] 1 2 3 [4 5 6] 4 5 6 [[7 8 9] [10 11 12]] [7 8 9] 7 8 9  [10 11 12] 10 11 12

##用nditer()直接遍历N维数组内部每个元素,不需要进行多次for循环
arr3=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
for i in np.nditer(arr3):
    print(i)#结果为1 2 3 4 5 6 7 8 9 10 11 12

#nditer()遍历数组时可更改数组元素的数据类型,但不会更改原本的数组内部的数据类型,因此需要额外的空间来执行此操作,额外的空间被称作buffer,因此需要传递flags=['buffered']
arr=np.array([1,2,3])
for i in np.nditer(arr,flags=['buffered'],op_dtypes=['S']):
    print(i)
    print(i.dtype)
#结果为b'1' |S21 b'2' |S21 b'3' |S21

#同时获得array中的元素索引和元素内容
arr1=np.array([1,2,3])
arr2=np.array([[1,2],[3,4]])
arr3=np.array([[[1,2],[3,4]],[[5,6],[7,8]]])

for idx,x in np.ndenumerate(arr1):
    print(idx,x)
#结果为(0,) 1 (1,) 2 (2,) 3

for idx,x in np.ndenumerate(arr2):
    print(idx,x)
#结果为(0, 0) 1 (0, 1) 2 (1, 0) 3 (1, 1) 4

for idx,x in np.ndenumerate(arr3):
    print(idx,x)
#结果为(0, 0, 0) 1 (0, 0, 1) 2 (0, 1, 0) 3 (0, 1, 1) 4 (1, 0, 0) 5 (1, 0, 1) 6 (1, 1, 0) 7 (1, 1, 1) 8


原文始发于微信公众号(BioInfo):W3Schools-NumPy系列2

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/238164.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!