建議10 numpy使用基礎

2022-07-17 08:57:10 字數 4921 閱讀 8156

#

-*- coding: utf-8 -*-

import

numpy as np

#----------------------------------------

#-- 定義 ndarray

#-- 先申明為python的序列,再轉化為numpy的陣列

#----------------------------------------

ada = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])

#獲得陣列大小

print

ada.shape

#設定陣列大小

ada.shape = 4,3

#當某個軸的元素為-1時,將根據陣列元素的個數自動計算此軸的長度

ada.shape = 3,-1

#使用陣列的reshape方法,可以建立乙個改變了尺寸的新陣列,原陣列的shape保持不變

ada2 = ada.reshape((2,-1))

#陣列ada和ada2其實共享資料儲存記憶體區域,因此修改其中任意乙個陣列的元素都會同時修改另外乙個陣列的內容:

ada[2,1] = 100

print

ada,ada2

#陣列的元素型別可以通過dtype屬性獲得

np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.float)

#----------------------------------------

#-- 定義 ndarray

#-- 採用numpy提供了很多專門用來建立陣列

#----------------------------------------

#arange函式類似於python的range函式,通過指定開始值、終值和步長來建立一維陣列,注意陣列不包括終值:

np.arange(0,1,0.1)

#linspace函式通過指定開始值、終值和元素個數來建立一維陣列,可以通過endpoint關鍵字指定是否包括終值,預設設定是包括終值:

np.linspace(0, 1, 12)

#logspace函式和linspace類似,不過它建立等比數列,下面的例子產生1(10^0)到100(10^2)、有20個元素的等比數列:

np.logspace(0, 2, 20)

#使用frombuffer, fromstring, fromfile等函式可以從位元組序列建立陣列

s = "

abcdefgh

"np.fromstring(s, dtype=np.int8)

np.fromstring(s, dtype=np.int16)

#fromfunction函式的第乙個引數為計算每個陣列元素的函式,第二個引數為陣列的大小(shape),因為它支援多維陣列,所以第二個引數必須是乙個序列

deffunc(i):

return i%4+1np.fromfunction(func, (10,))

#建立乙個二維陣列表示九九乘法表

deffunc2(i, j):

return (i+1) * (j+1)

a = np.fromfunction(func2, (9,9))

#----------------------------------------

#-- 使用下標範圍

#-- 通過下標範圍獲取的新的陣列是原始陣列的乙個檢視。它與原始陣列共享同一塊資料空間:

#----------------------------------------

b = a[3:7] #

通過下標範圍產生乙個新的陣列b,b和a共享同一塊資料空間

b[2] = -10 #

將b的第2個元素修改為-10

a #a的第5個元素也被修改為10

#----------------------------------------

#-- 使用整數序列

#-- 當使用整數序列對陣列元素進行訪問時,將使用整數序列中的每個元素作為下標,整數序列可以是列表或者陣列。

#-- 使用整數序列作為下標獲得的陣列不和原始陣列共享資料空間。

#----------------------------------------

x = np.arange(10,1,-1)

x[[3, 3, 1, 8]] #

獲取x中的下標為3, 3, 1, 8的4個元素,組成乙個新的陣列

b = x[np.array([3,3,-3,8])] #

下標可以是負數

x[[3,5,1]] = -1, -2, -3 #

整數序列下標也可以用來修改元素的值

#----------------------------------------

#-- 使用布林陣列

#-- 當使用布林陣列b作為下標訪問陣列x中的元素時,將收集陣列x中所有在陣列b中對應下標為true的元素。

#-- 使用布林陣列作為下標獲得的陣列不和原始陣列共享資料空間,注意這種方式只對應於布林陣列,不能使用布林列表。

#----------------------------------------

x = np.arange(5,0,-1)

#布林陣列中下標為0,2的元素為true,因此獲取x中下標為0,2的元素

x[np.array([true, false, true, false, false])]

#如果是布林列表,則把true當作1, false當作0,按照整數序列方式獲取x中的元素

x[[true, false, true, false, false]]

#布林陣列的長度不夠時,不夠的部分都當作false

x[np.array([true, false, true, true])]

#布林陣列下標也可以用來修改元素

x[np.array([true, false, true, true])] = -1, -2, -3

#產生乙個長度為10,元素值為0-1的隨機數的陣列

x = np.random.rand(10)

#陣列x中的每個元素和0.5進行大小比較,得到乙個布林陣列,true表示x中對應的值大於0.5

x>0.5

#使用x>0.5返回的布林陣列收集x中的元素,因此得到的結果是x中所有大於0.5的元素的陣列

x[x>0.5]

#----------------------------------------

#-- 多維陣列

#-- 多維陣列的訪問和一維陣列類似,因為多維陣列有多個軸,因此它的下標需要用多個值來表示,

#-- numpy採用組元(tuple)作為陣列的下標

#----------------------------------------

#多維陣列同樣也可以使用整數序列和布林陣列進行訪問。

#----------------------------------------

#-- ufunc

#-- ufunc是universal function的縮寫,它是一種能對陣列的每個元素進行操作的函式。

#----------------------------------------

#linspace產生乙個從0到2*pi的等距離的10個數

x = np.linspace(0, 2*np.pi, 10)

y = np.sin(x) #

np.sin是乙個ufunc函式,因此它對x中的每個元素求正弦值,然後將結果返回,並且賦值給y

#如果我們希望將sin函式所計算的結果直接覆蓋到陣列x上去的話,可以將要被覆蓋的陣列作為第二個引數傳遞給ufunc函式.

t =np.sin(x,x)

#add函式就是乙個最常用的

a = np.arange(0,4)

b = np.arange(1,5)

np.add(a,b)

#add函式返回乙個新的陣列,此陣列的每個元素都為兩個引數陣列的對應元素之和。

#它接受第3個引數指定計算結果所要寫入的陣列,如果指定的話,add函式就不再產生新的陣列。

np.add(a,b,a)

#----------------------------------------

#-- ufunc

#y = x1 + x2: add(x1, x2 [, y])

#y = x1 - x2: subtract(x1, x2 [, y])

#y = x1 * x2: multiply (x1, x2 [, y])

#y = x1 / x2: divide(x1, x2 [, y]), 如果兩個陣列的元素為整數,那麼用整數除法

#y = x1 / x2: true divide (x1, x2 [, y]), 總是返回精確的商

#y = x1 // x2: floor divide (x1, x2 [, y]), 總是對返回值取整

#y = -x: negative(x [,y])

#y = x1**x2: power(x1, x2 [, y])

#y = x1 % x2: remainder(x1, x2 [, y]), mod(x1, x2, [, y]) #注意

#要運算的陣列很大的話,會因為產生大量的中間結果而降低程式的運算效率。例如:假設a b c三個陣列採用算式x=a*b+c計算

#t = a * b

#x = t + c

#del t

#分解的好處以減少一次記憶體分配。

#----------------------------------------

injection for Xcode10使用方法

對於乙個使用xcode的使用者來說,麻煩的地方在於使用 布置介面時候的除錯,5s改一下 用10s檢視修改效果,如果電腦配置稍低,時間更長,這是病,得治,哈哈。下面就來說一下injection的使用,injection是乙個外掛程式,修改 之後,只要command s即可重新整理模擬器,顯示已經修改的...

10條防採集建議

筆者自己是寫採集器的,所以對 防採集有一些心得體會。因為是在上班時間,各種方法只是簡單的提及。很多防採集方法在施行的時候需要考慮是否影響搜尋引擎對 的抓取,所以先來分析下一般採集器和搜尋引擎爬蟲採集有何不同。相同點 a.兩者都需要直接抓取到網頁原始碼才能有效工作,b.兩者單位時間內會多次大量抓取被訪...

10 個 Redis 建議 技巧

redis 在當前的技術社群裡是非常熱門的。從來自 antirez 乙個小小的個人專案到成為記憶體資料儲存行業的標準,redis已經走過了很長的一段路。隨之而來的一系列最佳實踐,使得大多數人可以正確地使用 redis。下面我們將探索正確使用 redis 的10個技巧。1 停止使用 keys okay...