numpy用法

NUMPY

Numpy是Python中科学计算的核心库。它提供了一个高性能的多维数组对象,以及用于处理这些数组的工具。如果您已经熟悉MATLAB,那么您可能会发现本教程对Numpy入门非常有用。

Arrays

numpy数组是一个值网格,所有类型都相同,并且由非负整数元组索引。维数是数组的排名;数组的形状是一个整数元组,给出了每个维度的数组大小。
我们可以从嵌套的Python列表初始化numpy数组,并使用方括号访问元素:

import numpy as np

a = np.array([1, 2, 3])   # Create a rank 1 array
print(type(a))            # Prints "<class 'numpy.ndarray'>"
print(a.shape)            # Prints "(3,)"
print(a[0], a[1], a[2])   # Prints "1 2 3"
a[0] = 5                  # Change an element of the array
print(a)                  # Prints "[5, 2, 3]"

b = np.array([[1,2,3],[4,5,6]])    # Create a rank 2 array
print(b.shape)                     # Prints "(2, 3)"
print(b[0, 0], b[0, 1], b[1, 0])   # Prints "1 2 4"

Numpy还提供了许多创建数组的函数:

import numpy as np

a = np.zeros((2,2))   # Create an array of all zeros
print(a)              # Prints "[[ 0.  0.]
                      #          [ 0.  0.]]"

b = np.ones((1,2))    # Create an array of all ones
print(b)              # Prints "[[ 1.  1.]]"

c = np.full((2,2), 7)  # Create a constant array
print(c)               # Prints "[[ 7.  7.]
                       #          [ 7.  7.]]"

d = np.eye(2)         # Create a 2x2 identity matrix
print(d)              # Prints "[[ 1.  0.]
                      #          [ 0.  1.]]"

e = np.random.random((2,2))  # Create an array filled with random values
print(e)                     # Might print "[[ 0.91940167  0.08143941]
                             #               [ 0.68744134  0.87236687]]"

Array indexing

Numpy offers several ways to index into arrays.

Slicing: Similar to Python lists, numpy arrays can be sliced. Since arrays may be multidimensional, you must specify a slice for each dimension of the array:

import numpy as np

Create the following rank 2 array with shape (3, 4)

[[ 1 2 3 4]

[ 5 6 7 8]

[ 9 10 11 12]]

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

Use slicing to pull out the subarray consisting of the first 2 rows

and columns 1 and 2; b is the following array of shape (2, 2):

[[2 3]

[6 7]]

b = a[:2, 1:3]

A slice of an array is a view into the same data, so modifying it

will modify the original array.

print(a[0, 1]) # Prints “2”
b[0, 0] = 77 # b[0, 0] is the same piece of data as a[0, 1]
print(a[0, 1]) # Prints “77”
You can also mix integer indexing with slice indexing. However, doing so will yield an array of lower rank than the original array. Note that this is quite different from the way that MATLAB handles array slicing:

import numpy as np

Create the following rank 2 array with shape (3, 4)

[[ 1 2 3 4]

[ 5 6 7 8]

[ 9 10 11 12]]

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

Two ways of accessing the data in the middle row of the array.

Mixing integer indexing with slices yields an array of lower rank,

while using only slices yields an array of the same rank as the

original array:

row_r1 = a[1, :] # Rank 1 view of the second row of a
row_r2 = a[1:2, :] # Rank 2 view of the second row of a
print(row_r1, row_r1.shape) # Prints “[5 6 7 8] (4,)”
print(row_r2, row_r2.shape) # Prints “[[5 6 7 8]] (1, 4)”

We can make the same distinction when accessing columns of an array:

col_r1 = a[:, 1]
col_r2 = a[:, 1:2]
print(col_r1, col_r1.shape) # Prints “[ 2 6 10] (3,)”
print(col_r2, col_r2.shape) # Prints “[[ 2]
# [ 6]
# [10]] (3, 1)”
Integer array indexing: When you index into numpy arrays using slicing, the resulting array view will always be a subarray of the original array. In contrast, integer array indexing allows you to construct arbitrary arrays using the data from another array. Here is an example:

import numpy as np

a = np.array([[1,2], [3, 4], [5, 6]])

An example of integer array indexing.

The returned array will have shape (3,) and

print(a[[0, 1, 2], [0, 1, 0]]) # Prints “[1 4 5]”

The above example of integer array indexing is equivalent to this:

print(np.array([a[0, 0], a[1, 1], a[2, 0]])) # Prints “[1 4 5]”

When using integer array indexing, you can reuse the same

element from the source array:

print(a[[0, 0], [1, 1]]) # Prints “[2 2]”

Equivalent to the previous integer array indexing example

print(np.array([a[0, 1], a[0, 1]])) # Prints “[2 2]”
One useful trick with integer array indexing is selecting or mutating one element from each row of a matrix:

import numpy as np

Create a new array from which we will select elements

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

print(a) # prints “array([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])”

Create an array of indices

b = np.array([0, 2, 0, 1])

Select one element from each row of a using the indices in b

print(a[np.arange(4), b]) # Prints “[ 1 6 7 11]”

Mutate one element from each row of a using the indices in b

a[np.arange(4), b] += 10

print(a) # prints "array([[11, 2, 3],
# [ 4, 5, 16],
# [17, 8, 9],
# [10, 21, 12]])
Boolean array indexing: Boolean array indexing lets you pick out arbitrary elements of an array. Frequently this type of indexing is used to select the elements of an array that satisfy some condition. Here is an example:

import numpy as np

a = np.array([[1,2], [3, 4], [5, 6]])

bool_idx = (a > 2) # Find the elements of a that are bigger than 2;
# this returns a numpy array of Booleans of the same
# shape as a, where each slot of bool_idx tells
# whether that element of a is > 2.

print(bool_idx) # Prints “[[False False]
# [ True True]
# [ True True]]”

We use boolean array indexing to construct a rank 1 array

consisting of the elements of a corresponding to the True values

of bool_idx

print(a[bool_idx]) # Prints “[3 4 5 6]”

We can do all of the above in a single concise statement:

print(a[a > 2]) # Prints “[3 4 5 6]”
For brevity we have left out a lot of details about numpy array indexing; if you want to know more you should read the documentation.

Datatypes

Every numpy array is a grid of elements of the same type. Numpy provides a large set of numeric datatypes that you can use to construct arrays. Numpy tries to guess a datatype when you create an array, but functions that construct arrays usually also include an optional argument to explicitly specify the datatype. Here is an example:

import numpy as np

x = np.array([1, 2]) # Let numpy choose the datatype
print(x.dtype) # Prints “int64”

x = np.array([1.0, 2.0]) # Let numpy choose the datatype
print(x.dtype) # Prints “float64”

x = np.array([1, 2], dtype=np.int64) # Force a particular datatype
print(x.dtype) # Prints “int64”
You can read all about numpy datatypes in the documentation.

Array math

Basic mathematical functions operate elementwise on arrays, and are available both as operator overloads and as functions in the numpy module:

import numpy as np

x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)

Elementwise sum; both produce the array

[[ 6.0 8.0]

[10.0 12.0]]

print(x + y)
print(np.add(x, y))

Elementwise difference; both produce the array

[[-4.0 -4.0]

[-4.0 -4.0]]

print(x - y)
print(np.subtract(x, y))

Elementwise product; both produce the array

[[ 5.0 12.0]

[21.0 32.0]]

print(x * y)
print(np.multiply(x, y))

Elementwise division; both produce the array

[[ 0.2 0.33333333]

[ 0.42857143 0.5 ]]

print(x / y)
print(np.divide(x, y))

Elementwise square root; produces the array

[[ 1. 1.41421356]

[ 1.73205081 2. ]]

print(np.sqrt(x))
Note that unlike MATLAB, * is elementwise multiplication, not matrix multiplication. We instead use the dot function to compute inner products of vectors, to multiply a vector by a matrix, and to multiply matrices. dot is available both as a function in the numpy module and as an instance method of array objects:

import numpy as np

x = np.array([[1,2],[3,4]])
y = np.array([[5,6],[7,8]])

v = np.array([9,10])
w = np.array([11, 12])

Inner product of vectors; both produce 219

print(v.dot(w))
print(np.dot(v, w))

Matrix / vector product; both produce the rank 1 array [29 67]

print(x.dot(v))
print(np.dot(x, v))

Matrix / matrix product; both produce the rank 2 array

[[19 22]

[43 50]]

print(x.dot(y))
print(np.dot(x, y))
Numpy provides many useful functions for performing computations on arrays; one of the most useful is sum:

import numpy as np

x = np.array([[1,2],[3,4]])

print(np.sum(x)) # Compute sum of all elements; prints “10”
print(np.sum(x, axis=0)) # Compute sum of each column; prints “[4 6]”
print(np.sum(x, axis=1)) # Compute sum of each row; prints “[3 7]”
You can find the full list of mathematical functions provided by numpy in the documentation.

Apart from computing mathematical functions using arrays, we frequently need to reshape or otherwise manipulate data in arrays. The simplest example of this type of operation is transposing a matrix; to transpose a matrix, simply use the T attribute of an array object:

import numpy as np

x = np.array([[1,2], [3,4]])
print(x) # Prints “[[1 2]
# [3 4]]”
print(x.T) # Prints “[[1 3]
# [2 4]]”

Note that taking the transpose of a rank 1 array does nothing:

v = np.array([1,2,3])
print(v) # Prints “[1 2 3]”
print(v.T) # Prints “[1 2 3]”
Numpy provides many more functions for manipulating arrays; you can see the full list in the documentation.

Broadcasting

Broadcasting is a powerful mechanism that allows numpy to work with arrays of different shapes when performing arithmetic operations. Frequently we have a smaller array and a larger array, and we want to use the smaller array multiple times to perform some operation on the larger array.

For example, suppose that we want to add a constant vector to each row of a matrix. We could do it like this:

import numpy as np

We will add the vector v to each row of the matrix x,

storing the result in the matrix y

x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = np.empty_like(x) # Create an empty matrix with the same shape as x

Add the vector v to each row of the matrix x with an explicit loop

for i in range(4):
y[i, :] = x[i, :] + v

Now y is the following

[[ 2 2 4]

[ 5 5 7]

[ 8 8 10]

[11 11 13]]

print(y)
This works; however when the matrix x is very large, computing an explicit loop in Python could be slow. Note that adding the vector v to each row of the matrix x is equivalent to forming a matrix vv by stacking multiple copies of v vertically, then performing elementwise summation of x and vv. We could implement this approach like this:

import numpy as np

We will add the vector v to each row of the matrix x,

storing the result in the matrix y

x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
vv = np.tile(v, (4, 1)) # Stack 4 copies of v on top of each other
print(vv) # Prints “[[1 0 1]
# [1 0 1]
# [1 0 1]
# [1 0 1]]”
y = x + vv # Add x and vv elementwise
print(y) # Prints “[[ 2 2 4
# [ 5 5 7]
# [ 8 8 10]
# [11 11 13]]”
Numpy broadcasting allows us to perform this computation without actually creating multiple copies of v. Consider this version, using broadcasting:

import numpy as np

We will add the vector v to each row of the matrix x,

storing the result in the matrix y

x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = x + v # Add v to each row of x using broadcasting
print(y) # Prints “[[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]
# [11 11 13]]”
The line y = x + v works even though x has shape (4, 3) and v has shape (3,) due to broadcasting; this line works as if v actually had shape (4, 3), where each row was a copy of v, and the sum was performed elementwise.

Broadcasting two arrays together follows these rules:

If the arrays do not have the same rank, prepend the shape of the lower rank array with 1s until both shapes have the same length.
The two arrays are said to be compatible in a dimension if they have the same size in the dimension, or if one of the arrays has size 1 in that dimension.
The arrays can be broadcast together if they are compatible in all dimensions.
After broadcasting, each array behaves as if it had shape equal to the elementwise maximum of shapes of the two input arrays.
In any dimension where one array had size 1 and the other array had size greater than 1, the first array behaves as if it were copied along that dimension
If this explanation does not make sense, try reading the explanation from the documentation or this explanation.

Functions that support broadcasting are known as universal functions. You can find the list of all universal functions in the documentation.

Here are some applications of broadcasting:

import numpy as np

Compute outer product of vectors

v = np.array([1,2,3]) # v has shape (3,)
w = np.array([4,5]) # w has shape (2,)

To compute an outer product, we first reshape v to be a column

vector of shape (3, 1); we can then broadcast it against w to yield

an output of shape (3, 2), which is the outer product of v and w:

[[ 4 5]

[ 8 10]

[12 15]]

print(np.reshape(v, (3, 1)) * w)

Add a vector to each row of a matrix

x = np.array([[1,2,3], [4,5,6]])

x has shape (2, 3) and v has shape (3,) so they broadcast to (2, 3),

giving the following matrix:

[[2 4 6]

[5 7 9]]

print(x + v)

Add a vector to each column of a matrix

x has shape (2, 3) and w has shape (2,).

If we transpose x then it has shape (3, 2) and can be broadcast

against w to yield a result of shape (3, 2); transposing this result

yields the final result of shape (2, 3) which is the matrix x with

the vector w added to each column. Gives the following matrix:

[[ 5 6 7]

[ 9 10 11]]

print((x.T + w).T)

Another solution is to reshape w to be a column vector of shape (2, 1);

we can then broadcast it directly against x to produce the same

output.

print(x + np.reshape(w, (2, 1)))

Multiply a matrix by a constant:

x has shape (2, 3). Numpy treats scalars as arrays of shape ();

these can be broadcast together to shape (2, 3), producing the

following array:

[[ 2 4 6]

[ 8 10 12]]

print(x * 2)
Broadcasting typically makes your code more concise and faster, so you should strive to use it where possible.

Numpy Documentation

This brief overview has touched on many of the important things that you need to know about numpy, but is far from complete. Check out the numpy reference to find out much more about numpy.

SciPy

Numpy provides a high-performance multidimensional array and basic tools to compute with and manipulate these arrays. SciPy builds on this, and provides a large number of functions that operate on numpy arrays and are useful for different types of scientific and engineering applications.

The best way to get familiar with SciPy is to browse the documentation. We will highlight some parts of SciPy that you might find useful for this class.

Image operations

SciPy provides some basic functions to work with images. For example, it has functions to read images from disk into numpy arrays, to write numpy arrays to disk as images, and to resize images. Here is a simple example that showcases these functions:

from scipy.misc import imread, imsave, imresize

Read an JPEG image into a numpy array

img = imread(‘assets/cat.jpg’)
print(img.dtype, img.shape) # Prints “uint8 (400, 248, 3)”

We can tint the image by scaling each of the color channels

by a different scalar constant. The image has shape (400, 248, 3);

we multiply it by the array [1, 0.95, 0.9] of shape (3,);

numpy broadcasting means that this leaves the red channel unchanged,

and multiplies the green and blue channels by 0.95 and 0.9

respectively.

img_tinted = img * [1, 0.95, 0.9]

Resize the tinted image to be 300 by 300 pixels.

img_tinted = imresize(img_tinted, (300, 300))

Write the tinted image back to disk

imsave(‘assets/cat_tinted.jpg’, img_tinted)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的NumPy是一个用于科学计算和数据分析的基础包,提供了大量的矩阵和数组的计算函数。安装NumPy可以使用pip命令:pip install numpy。要查看NumPy的版本,可以使用numpy.__version__。在代码中导入NumPy时,通常使用import numpy as np。 NumPy的主要功能之一是创建ndarray(N-dimensional array)。我们可以使用np.array()函数来创建多维数组。例如,使用np.array([1, 2, 3])可以创建一个一维数组,使用np.array([[1, 2], [3, 4]])可以创建一个二维数组。 除了np.array()函数外,NumPy还提供了其他创建数组的方法,比如使用np.zeros()创建全零数组,np.ones()创建全一数组,np.random.randn()创建随机数组等。 另外,如果想对矩阵进行转置,可以使用numpy的transpose()函数来实现。例如,对于一个二维数组a,可以使用np.transpose(a)来实现转置操作。 总结起来,Python中的NumPy是一个功能强大的科学计算和数据分析的基础包,可以用来创建和操作多维数组,以及进行矩阵的转置操作等。这些功能可以帮助我们进行高效的数值计算和数据处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [numpy 用法总结](https://blog.csdn.net/Dear_learner/article/details/125018228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python-numpy的详细使用](https://blog.csdn.net/wander_ing/article/details/105763309)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Python 使用Numpy对矩阵进行转置的方法](https://download.csdn.net/download/weixin_38693192/12864784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值