這篇文章討論了安裝 NumPy,然後建立、讀取和排序 NumPy 陣列。
NumPy(即 Numerical Python)是一個函式庫,它使得在Python 中對線性數列和矩陣進行統計和集合運算變得容易。 我在 Python 資料類型的筆記中介紹過,它比 Python 的清單快幾個數量級。 NumPy 在數據分析和科學計算中使用得相當頻繁。
我將介紹安裝 NumPy,然後建立、讀取和排序 NumPy 陣列。 NumPy 陣列也被稱為 ndarray,即 N 維數組的縮寫。
使用 pip
安裝NumPy 套件非常簡單,可以像安裝其他軟體套件一樣進行安裝:
<ol><li><code><span>pip install numpy</span></code></li></ol>
安裝了NumPy 套件後,只需將其導入你的Python 文件中:
<ol><li><code><span>import</span><span> numpy </span><span>as</span><span> np</span></code></li></ol>
將 numpy
以 np
之名導入是一個標準的慣例,但你可以不使用 np
,而是使用你想要的任何其他別名。
#當涉及到處理大量的數值時,NumPy 比普通的 Python 列表快幾個數量級。為了看看它到底有多快,我首先測量在普通 Python 清單上進行 min()
和 max()
操作的時間。
我將首先建立一個具有999,999,999 項的Python 清單:
<ol> <li><code><span>>>></span><span> my_list </span><span>=</span><span> range</span><span>(</span><span>1</span><span>,</span><span> </span><span>1000000000</span><span>)</span></code></li> <li><code><span>>>></span><span> len</span><span>(</span><span>my_list</span><span>)</span></code></li> <li><code><span>999999999</span></code></li> </ol>
現在我將測量在這個清單中找到最小值的時間:
<ol> <li><code><span>>>></span><span> start </span><span>=</span><span> </span><span>time</span><span>.</span><span>time</span><span>()</span></code></li> <li><code><span>>>></span><span> min</span><span>(</span><span>my_list</span><span>)</span></code></li> <li><code><span>1</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>'Time elapsed in milliseconds: '</span><span> </span><span>+</span><span> str</span><span>((</span><span>time</span><span>.</span><span>time</span><span>()</span><span> </span><span>-</span><span> start</span><span>)</span><span> </span><span>*</span><span> </span><span>1000</span><span>))</span></code></li> <li><code><span>Time</span><span> elapsed </span><span>in</span><span> milliseconds</span><span>:</span><span> </span><span>27007.00879096985</span></code></li> </ol>
這花了大約27,007 毫秒,也就是大約 27 秒。這是個很長的時間。現在我試著找出尋找最大值的時間:
<ol> <li><code><span>>>></span><span> start </span><span>=</span><span> </span><span>time</span><span>.</span><span>time</span><span>()</span></code></li> <li><code><span>>>></span><span> max</span><span>(</span><span>my_list</span><span>)</span></code></li> <li><code><span>999999999</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>'Time elapsed in milliseconds: '</span><span> </span><span>+</span><span> str</span><span>((</span><span>time</span><span>.</span><span>time</span><span>()</span><span> </span><span>-</span><span> start</span><span>)</span><span> </span><span>*</span><span> </span><span>1000</span><span>))</span></code></li> <li><code><span>Time</span><span> elapsed </span><span>in</span><span> milliseconds</span><span>:</span><span> </span><span>28111.071348190308</span></code></li> </ol>
這花了大約 28,111 毫秒,也就是大約 28 秒。
現在我試試用 NumPy 找到最小值和最大值的時間:
<ol> <li><code><span>>>></span><span> my_list </span><span>=</span><span> np</span><span>.</span><span>arange</span><span>(</span><span>1</span><span>,</span><span> </span><span>1000000000</span><span>)</span></code></li> <li><code><span>>>></span><span> len</span><span>(</span><span>my_list</span><span>)</span></code></li> <li><code><span>999999999</span></code></li> <li><code><span>>>></span><span> start </span><span>=</span><span> </span><span>time</span><span>.</span><span>time</span><span>()</span></code></li> <li><code><span>>>></span><span> my_list</span><span>.</span><span>min</span><span>()</span></code></li> <li><code><span>1</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>'Time elapsed in milliseconds: '</span><span> </span><span>+</span><span> str</span><span>((</span><span>time</span><span>.</span><span>time</span><span>()</span><span> </span><span>-</span><span> start</span><span>)</span><span> </span><span>*</span><span> </span><span>1000</span><span>))</span></code></li> <li><code><span>Time</span><span> elapsed </span><span>in</span><span> milliseconds</span><span>:</span><span> </span><span>1151.1778831481934</span></code></li> <li><code><span>>>></span></code></li> <li><code><span>>>></span><span> start </span><span>=</span><span> </span><span>time</span><span>.</span><span>time</span><span>()</span></code></li> <li><code><span>>>></span><span> my_list</span><span>.</span><span>max</span><span>()</span></code></li> <li><code><span>999999999</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>'Time elapsed in milliseconds: '</span><span> </span><span>+</span><span> str</span><span>((</span><span>time</span><span>.</span><span>time</span><span>()</span><span> </span><span>-</span><span> start</span><span>)</span><span> </span><span>*</span><span> </span><span>1000</span><span>))</span></code></li> <li><code><span>Time</span><span> elapsed </span><span>in</span><span> milliseconds</span><span>:</span><span> </span><span>1114.8970127105713</span></code></li> </ol>
找到最小值花了大約 1151 毫秒,找到最大值 1114 毫秒。這大約是 1 秒。
正如你所看到的,使用 NumPy 可以將尋找一個大約有 10 億個值的列表的最小值和最大值的時間 從大約 28 秒減少到 1 秒。這就是 NumPy 的強大之處。
有幾種方法可以在 NumPy 中建立 ndarray。
你可以透過使用元素清單來建立一個 ndarray:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>5</span><span>])</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[</span><span>1</span><span> </span><span>2</span><span> </span><span>3</span><span> </span><span>4</span><span> </span><span>5</span><span>]</span></code></li> </ol>
有了上面的 ndarray 定義,我會檢查幾件事。首先,上面定義的變數的型別是 numpy.ndarray
。這是所有 NumPy ndarray 的類型:
<ol> <li><code><span>>>></span><span> type</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span><span>class</span><span> </span><span>'numpy.ndarray'</span><span>></span></span></code></li> </ol>
這裡要注意的另一件事是 “形狀”。 ndarray 的形狀是 ndarray 的每個維度的長度。你可以看到,my_ndarray
的形狀是 (5,)
。這表示 my_ndarray
包含一個有 5 個元素的維度(軸)。
<ol> <li><code><span>>>></span><span> np</span><span>.</span><span>shape</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>(</span><span>5</span><span>,)</span></code></li> </ol>
陣列中的維數被稱為它的 “秩”。所以上面的 ndarray 的秩是 1。
我將定義另一個 ndarray my_ndarray2
作為一個多維 ndarray。那麼它的形狀會是什麼呢?請看下面:
<ol> <li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([(</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>),</span><span> </span><span>(</span><span>4</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>6</span><span>)])</span></code></li> <li><code><span>>>></span><span> np</span><span>.</span><span>shape</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li> <li><code><span>(</span><span>2</span><span>,</span><span> </span><span>3</span><span>)</span></code></li> </ol>
這是一個秩為 2 的 ndarray。另一個要檢查的屬性是 dtype
,也就是資料型態。檢查我們的 ndarray 的 dtype
可以得到以下結果:
<ol> <li><code><span>>>></span><span> my_ndarray</span><span>.</span><span>dtype</span></code></li> <li><code><span>dtype</span><span>(</span><span>'int64'</span><span>)</span></code></li> </ol>
int64
意味著我們的 ndarray 是由 64 位元整數組成的。 NumPy 不能建立混合類型的 ndarray,必須只包含一種類型的元素。如果你定義了一個包含混合元素類型的 ndarray,NumPy 會自動將所有的元素類型轉換為可以包含所有元素的最高元素類型。
例如,建立一個 int
和 float
的混合序列將建立一個 float64
的ndarray:
<ol> <li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2.0</span><span>,</span><span> </span><span>3</span><span>])</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li> <li><code><span>[</span><span>1.</span><span> </span><span>2.</span><span> </span><span>3.</span><span>]</span></code></li> <li><code><span>>>></span><span> my_ndarray2</span><span>.</span><span>dtype</span></code></li> <li><code><span>dtype</span><span>(</span><span>'float64'</span><span>)</span></code></li> </ol>
另外,將其中一個元素設為 string
將建立 dtype
等於 <u21> 的字串ndarray,表示我們的ndarray 包含unicode 字串:</u21>
<ol> <li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>'2'</span><span>,</span><span> </span><span>3</span><span>])</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li> <li><code><span>[</span><span>'1'</span><span> </span><span>'2'</span><span> </span><span>'3'</span><span>]</span></code></li> <li><code><span>>>></span><span> my_ndarray2</span><span>.</span><span>dtype</span></code></li> <li><code><span>dtype</span><span>(</span><span>'<u21><span>)</span></u21></span></code></li> </ol>
size
屬性將顯示我們的ndarray 中存在的元素總數:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>5</span><span>])</span></code></li> <li><code><span>>>></span><span> my_ndarray</span><span>.</span><span>size</span></code></li> <li><code><span>5</span></code></li> </ol>
如果你不想直接使用清單來建立ndarray,還有幾種可以用來創建它的NumPy 方法。
你可以用 np.zeros()
來建立一個填滿 0 的 ndarray。它需要一個「形狀」作為參數,這是一個包含行數和列數的清單。它也可以接受一個可選的 dtype
參數,這是 ndarray 的資料類型:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>zeros</span><span>([</span><span>2</span><span>,</span><span>3</span><span>],</span><span> dtype</span><span>=</span><span>int</span><span>)</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[[</span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span>]]</span></code></li> </ol>
你可以使用 np. ones()
来创建一个填满 1
的 ndarray:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>ones</span><span>([</span><span>2</span><span>,</span><span>3</span><span>],</span><span> dtype</span><span>=</span><span>int</span><span>)</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[[</span><span>1</span><span> </span><span>1</span><span> </span><span>1</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span>1</span><span> </span><span>1</span><span> </span><span>1</span><span>]]</span></code></li> </ol>
你可以使用 np.full()
来给 ndarray 填充一个特定的值:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>full</span><span>([</span><span>2</span><span>,</span><span>3</span><span>],</span><span> </span><span>10</span><span>,</span><span> dtype</span><span>=</span><span>int</span><span>)</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[[</span><span>10</span><span> </span><span>10</span><span> </span><span>10</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span>10</span><span> </span><span>10</span><span> </span><span>10</span><span>]]</span></code></li> </ol>
你可以使用 np.eye()
来创建一个单位矩阵 / ndarray,这是一个沿主对角线都是 1
的正方形矩阵。正方形矩阵是一个行数和列数相同的矩阵:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>eye</span><span>(</span><span>3</span><span>,</span><span> dtype</span><span>=</span><span>int</span><span>)</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[[</span><span>1</span><span> </span><span>0</span><span> </span><span>0</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span>0</span><span> </span><span>1</span><span> </span><span>0</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span>0</span><span> </span><span>0</span><span> </span><span>1</span><span>]]</span></code></li> </ol>
你可以使用 np.diag()
来创建一个沿对角线有指定数值的矩阵,而在矩阵的其他部分为 0
:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>diag</span><span>([</span><span>10</span><span>,</span><span> </span><span>20</span><span>,</span><span> </span><span>30</span><span>,</span><span> </span><span>40</span><span>,</span><span> </span><span>50</span><span>])</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[[</span><span>10</span><span></span><span>0</span><span></span><span>0</span><span></span><span>0</span><span></span><span>0</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span> </span><span>0</span><span> </span><span>20</span><span></span><span>0</span><span></span><span>0</span><span></span><span>0</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span> </span><span>0</span><span></span><span>0</span><span> </span><span>30</span><span></span><span>0</span><span></span><span>0</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span> </span><span>0</span><span></span><span>0</span><span></span><span>0</span><span> </span><span>40</span><span></span><span>0</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span> </span><span>0</span><span></span><span>0</span><span></span><span>0</span><span></span><span>0</span><span> </span><span>50</span><span>]]</span></code></li> </ol>
你可以使用 np.range()
来创建一个具有特定数值范围的 ndarray。它是通过指定一个整数的开始和结束(不包括)范围以及一个步长来创建的:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>arange</span><span>(</span><span>1</span><span>,</span><span> </span><span>20</span><span>,</span><span> </span><span>3</span><span>)</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[</span><span> </span><span>1</span><span></span><span>4</span><span></span><span>7</span><span> </span><span>10</span><span> </span><span>13</span><span> </span><span>16</span><span> </span><span>19</span><span>]</span></code></li> </ol>
ndarray 的值可以使用索引、分片或布尔索引来读取。
在索引中,你可以使用 ndarray 的元素的整数索引来读取数值,就像你读取 Python 列表一样。就像 Python 列表一样,索引从 0
开始。
例如,在定义如下的 ndarray 中:
<ol><li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>arange</span><span>(</span><span>1</span><span>,</span><span> </span><span>20</span><span>,</span><span> </span><span>3</span><span>)</span></code></li></ol>
第四个值将是 my_ndarray[3]
,即 10
。最后一个值是 my_ndarray[-1]
,即 19
:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>arange</span><span>(</span><span>1</span><span>,</span><span> </span><span>20</span><span>,</span><span> </span><span>3</span><span>)</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>0</span><span>])</span></code></li> <li><code><span>1</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>3</span><span>])</span></code></li> <li><code><span>10</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[-</span><span>1</span><span>])</span></code></li> <li><code><span>19</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>5</span><span>])</span></code></li> <li><code><span>16</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>6</span><span>])</span></code></li> <li><code><span>19</span></code></li> </ol>
你也可以使用分片来读取 ndarray 的块。分片的工作方式是用冒号(:
)操作符指定一个开始索引和一个结束索引。然后,Python 将获取该开始和结束索引之间的 ndarray 片断:
<ol> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[:])</span></code></li> <li><code><span>[</span><span> </span><span>1</span><span></span><span>4</span><span></span><span>7</span><span> </span><span>10</span><span> </span><span>13</span><span> </span><span>16</span><span> </span><span>19</span><span>]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>2</span><span>:</span><span>4</span><span>])</span></code></li> <li><code><span>[</span><span> </span><span>7</span><span> </span><span>10</span><span>]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>5</span><span>:</span><span>6</span><span>])</span></code></li> <li><code><span>[</span><span>16</span><span>]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>6</span><span>:</span><span>7</span><span>])</span></code></li> <li><code><span>[</span><span>19</span><span>]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[:-</span><span>1</span><span>])</span></code></li> <li><code><span>[</span><span> </span><span>1</span><span></span><span>4</span><span></span><span>7</span><span> </span><span>10</span><span> </span><span>13</span><span> </span><span>16</span><span>]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[-</span><span>1</span><span>:])</span></code></li> <li><code><span>[</span><span>19</span><span>]</span></code></li> </ol>
分片创建了一个 ndarray 的引用(或视图)。这意味着,修改分片中的值也会改变原始 ndarray 的值。
比如说:
<ol> <li><code><span>>>></span><span> my_ndarray</span><span>[-</span><span>1</span><span>:]</span><span> </span><span>=</span><span> </span><span>100</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[</span><span></span><span>1</span><span> </span><span>4</span><span> </span><span>7</span><span></span><span>10</span><span></span><span>13</span><span></span><span>16</span><span> </span><span>100</span><span>]</span></code></li> </ol>
对于秩超过 1 的 ndarray 的分片,可以使用 [行开始索引:行结束索引, 列开始索引:列结束索引]
语法:
<ol> <li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([(</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>),</span><span> </span><span>(</span><span>4</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>6</span><span>)])</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li> <li><code><span>[[</span><span>1</span><span> </span><span>2</span><span> </span><span>3</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span>4</span><span> </span><span>5</span><span> </span><span>6</span><span>]]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>[</span><span>0</span><span>:</span><span>2</span><span>,</span><span>1</span><span>:</span><span>3</span><span>])</span></code></li> <li><code><span>[[</span><span>2</span><span> </span><span>3</span><span>]</span></code></li> <li><code><span> </span><span>[</span><span>5</span><span> </span><span>6</span><span>]]</span></code></li> </ol>
读取 ndarray 的另一种方法是使用布尔索引。在这种方法中,你在方括号内指定一个过滤条件,然后返回符合该条件的 ndarray 的一个部分。
例如,为了获得一个 ndarray 中所有大于 5 的值,你可以指定布尔索引操作 my_ndarray[my_ndarray > 5]
。这个操作将返回一个包含所有大于 5 的值的 ndarray:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>6</span><span>,</span><span> </span><span>7</span><span>,</span><span> </span><span>8</span><span>,</span><span> </span><span>9</span><span>,</span><span> </span><span>10</span><span>])</span></code></li> <li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> my_ndarray</span><span>[</span><span>my_ndarray </span><span>></span><span> </span><span>5</span><span>]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li> <li><code><span>[</span><span> </span><span>6</span><span></span><span>7</span><span></span><span>8</span><span></span><span>9</span><span> </span><span>10</span><span>]</span></code></li> </ol>
例如,为了获得一个 ndarray 中的所有偶数值,你可以使用如下的布尔索引操作:
<ol> <li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> my_ndarray</span><span>[</span><span>my_ndarray </span><span>%</span><span> </span><span>2</span><span> </span><span>==</span><span> </span><span>0</span><span>]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li> <li><code><span>[</span><span> </span><span>2</span><span></span><span>4</span><span></span><span>6</span><span></span><span>8</span><span> </span><span>10</span><span>]</span></code></li> </ol>
而要得到所有的奇数值,你可以用这个方法:
<ol> <li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> my_ndarray</span><span>[</span><span>my_ndarray </span><span>%</span><span> </span><span>2</span><span> </span><span>==</span><span> </span><span>1</span><span>]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li> <li><code><span>[</span><span>1</span><span> </span><span>3</span><span> </span><span>5</span><span> </span><span>7</span><span> </span><span>9</span><span>]</span></code></li> </ol>
NumPy 的 ndarray 允许进行矢量和标量算术操作。在矢量算术中,在两个 ndarray 之间进行一个元素的算术操作。在标量算术中,算术运算是在一个 ndarray 和一个常数标量值之间进行的。
如下的两个 ndarray:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>5</span><span>])</span></code></li> <li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>6</span><span>,</span><span> </span><span>7</span><span>,</span><span> </span><span>8</span><span>,</span><span> </span><span>9</span><span>,</span><span> </span><span>10</span><span>])</span></code></li> </ol>
如果你将上述两个 ndarray 相加,就会产生一个两个 ndarray 的元素相加的新的 ndarray。例如,产生的 ndarray 的第一个元素将是原始 ndarray 的第一个元素相加的结果,以此类推:
<ol> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2 </span><span>+</span><span> my_ndarray</span><span>)</span></code></li> <li><code><span>[</span><span> </span><span>7</span><span></span><span>9</span><span> </span><span>11</span><span> </span><span>13</span><span> </span><span>15</span><span>]</span></code></li> </ol>
这里,7
是 1
和 6
的和,这是我相加的 ndarray 中的前两个元素。同样,15
是 5
和10
之和,是最后一个元素。
请看以下算术运算:
<ol> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2 </span><span>-</span><span> my_ndarray</span><span>)</span></code></li> <li><code><span>[</span><span>5</span><span> </span><span>5</span><span> </span><span>5</span><span> </span><span>5</span><span> </span><span>5</span><span>]</span></code></li> <li><code><span>>>></span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2 </span><span>*</span><span> my_ndarray</span><span>)</span></code></li> <li><code><span>[</span><span> </span><span>6</span><span> </span><span>14</span><span> </span><span>24</span><span> </span><span>36</span><span> </span><span>50</span><span>]</span></code></li> <li><code><span>>>></span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2 </span><span>/</span><span> my_ndarray</span><span>)</span></code></li> <li><code><span>[</span><span>6.</span><span> </span><span>3.5</span><span></span><span>2.66666667</span><span> </span><span>2.25</span><span> </span><span>2.</span><span></span><span>]</span></code></li> </ol>
在 ndarray 中加一个标量值也有类似的效果,标量值被添加到 ndarray 的所有元素中。这被称为“广播”:
<ol> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray </span><span>+</span><span> </span><span>10</span><span>)</span></code></li> <li><code><span>[</span><span>11</span><span> </span><span>12</span><span> </span><span>13</span><span> </span><span>14</span><span> </span><span>15</span><span>]</span></code></li> <li><code><span>>>></span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray </span><span>-</span><span> </span><span>10</span><span>)</span></code></li> <li><code><span>[-</span><span>9</span><span> </span><span>-</span><span>8</span><span> </span><span>-</span><span>7</span><span> </span><span>-</span><span>6</span><span> </span><span>-</span><span>5</span><span>]</span></code></li> <li><code><span>>>></span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray </span><span>*</span><span> </span><span>10</span><span>)</span></code></li> <li><code><span>[</span><span>10</span><span> </span><span>20</span><span> </span><span>30</span><span> </span><span>40</span><span> </span><span>50</span><span>]</span></code></li> <li><code><span>>>></span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray </span><span>/</span><span> </span><span>10</span><span>)</span></code></li> <li><code><span>[</span><span>0.1</span><span> </span><span>0.2</span><span> </span><span>0.3</span><span> </span><span>0.4</span><span> </span><span>0.5</span><span>]</span></code></li> </ol>
有两种方法可以对 ndarray 进行原地或非原地排序。原地排序会对原始 ndarray 进行排序和修改,而非原地排序会返回排序后的 ndarray,但不会修改原始 ndarray。我将尝试这两个例子:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>3</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>4</span><span>])</span></code></li> <li><code><span>>>></span><span> my_ndarray</span><span>.</span><span>sort</span><span>()</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[</span><span>1</span><span> </span><span>2</span><span> </span><span>3</span><span> </span><span>4</span><span> </span><span>5</span><span>]</span></code></li> </ol>
正如你所看到的,sort()
方法对 ndarray 进行原地排序,并修改了原数组。
还有一个方法叫 np.sort()
,它对数组进行非原地排序:
<ol> <li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>3</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>4</span><span>])</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>np</span><span>.</span><span>sort</span><span>(</span><span>my_ndarray</span><span>))</span></code></li> <li><code><span>[</span><span>1</span><span> </span><span>2</span><span> </span><span>3</span><span> </span><span>4</span><span> </span><span>5</span><span>]</span></code></li> <li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li> <li><code><span>[</span><span>3</span><span> </span><span>1</span><span> </span><span>2</span><span> </span><span>5</span><span> </span><span>4</span><span>]</span></code></li> </ol>
正如你所看到的,np.sort()
方法返回一个已排序的 ndarray,但没有修改它。
我已经介绍了很多关于 NumPy 和 ndarray 的内容。我谈到了创建 ndarray,读取它们的不同方法,基本的向量和标量算术,以及排序。NumPy 还有很多东西可以探索,包括像 union()
和 intersection()
这样的集合操作,像 min()
和 max()
这样的统计操作,等等。
我希望我上面演示的例子是有用的。祝你在探索 NumPy 时愉快。
以上是用 NumPy 在 Python 中處理數字的詳細內容。更多資訊請關注PHP中文網其他相關文章!