1. 程式人生 > 其它 >dedecms利用addfields body在首頁呼叫文章內容

dedecms利用addfields body在首頁呼叫文章內容


接上文: 100個Numpy練習【1】 接上文: 100個Numpy練習【2】 接上文: 100個Numpy練習【3】


Numpy是Python做資料分析必須掌握的基礎庫之一,非常適合剛學習完Numpy基礎的同學,完成以下習題可以幫助你更好的掌握這個基礎庫。

Python版本:Python 3.6.2

Numpy版本:Numpy 1.13.1

61. 從陣列中找出與給定值最接近的值
(★★☆)

(提示: np.abs, argmin, flat)

Z = np.random.uniform(0,1,10)
z = 0.5
m = Z.flat[np.abs(Z - z).argmin()]
print(m)

62. 思考形狀為(1, 3)和(3, 1)的兩個陣列形狀,如何使用迭代器計算它們的和? (★★☆)

(提示: np.nditer)

A = np.arange(3).reshape(3, 1)
B = np.arange(3).reshape(1, 3)
it = np.nditer([A, B, None])
for x, y, z in it:
    z[...] = x + y
print (it.operands[2])

63. 建立一個具有name屬性的陣列類 (★★☆)

(提示: class method)

class NameArray(np.ndarray):
    def __new__(cls, array, name="no name"):
        obj = np.asarray(array).view(cls)
        obj.name = name
        return obj
    def __array_finalize__(self, obj):
        if obj is None: return
        self.info = getattr(obj, 'name', "no name")

Z = NamedArray(np.arange(10), "range_10")
print (Z.name)

64. 給定一個向量,如何讓在第二個向量索引的每個元素加1(注意重複索引)? (★★★)

(提示: np.bincount | np.add.at)

# Author: Brett Olsen

Z = np.ones(10)
I = np.random.randint(0,len(Z),20)
Z += np.bincount(I, minlength=len(Z))
print(Z)

# Another solution
# Author: Bartosz Telenczuk
np.add.at(Z, I, 1)
print(Z)

65. 如何根據索引列表I將向量X的元素累加到陣列F? (★★★)

(提示: np.bincount)

# Author: Alan G Isaac

X = [1,2,3,4,5,6]
I = [1,3,9,3,4,1]
F = np.bincount(I,X)
print(F)

66. 思考(dtype = ubyte)的(w, h, 3)影象,計算唯一顏色的值(★★★)

(提示: np.unique)

# Author: Nadav Horesh

w,h = 16,16
I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)
F = I[...,0]*256*256 + I[...,1]*256 +I[...,2]
n = len(np.unique(F))
print(np.unique(I))

67. 思考如何求一個四維陣列最後兩個軸的資料和(★★★)

(提示: sum(axis=(-2,-1)))

A = np.random.randint(0,10,(3,4,3,4))
# 傳遞一個元組(numpy 1.7.0)
sum = A.sum(axis=(-2,-1))
print(sum)

# 將最後兩個維度壓縮為一個
# (適用於不接受軸元組引數的函式)
sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1)
print(sum)

68. 考慮一維向量D,如何使用相同大小的向量S來計算D的子集的均值,其描述子集索引? (★★★)

(提示: np.bincount)

# Author: Jaime Fernández del Río

D = np.random.uniform(0,1,100)
S = np.random.randint(0,10,100)
D_sums = np.bincount(S, weights=D)
D_counts = np.bincount(S)
D_means = D_sums / D_counts
print(D_means)

# Pandas solution as a reference due to more intuitive code
import pandas as pd
print(pd.Series(D).groupby(S).mean())

69. 如何獲得點積的對角線? (★★★)

(提示: np.diag)

# Author: Mathieu Blondel

A = np.random.uniform(0,1,(5,5))
B = np.random.uniform(0,1,(5,5))

# Slow version  
np.diag(np.dot(A, B))

# Fast version
np.sum(A * B.T, axis=1)

# Faster version
np.einsum("ij,ji->i", A, B)

70.考慮向量[1,2,3,4,5],如何建立一個新的向量,在每個值之間交錯有3個連續的零? (★★★)

(提示: array[::4])

# Author: Warren Weckesser

Z = np.array([1,2,3,4,5])
nz = 3
Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz))
Z0[::nz+1] = Z
print(Z0)

71. 考慮一個維度(5,5,3)的陣列,如何將其與一個(5,5)的陣列相乘? (★★★)

(提示: array[:, :, None])

A = np.ones((5,5,3))
B = 2*np.ones((5,5))
print(A * B[:,:,None])

72. 如何對一個數組中任意兩行做交換? (★★★)

(提示: array[[]] = array[[]])

# Author: Eelco Hoogendoorn

A = np.arange(25).reshape(5,5)
A[[0,1]] = A[[1,0]]
print(A)

73. 思考描述10個三角形(共享頂點)的一組10個三元組,找到組成所有三角形的唯一線段集 (★★★)

(提示: repeat, np.roll, np.sort, view, np.unique)

# Author: Nicolas P. Rougier

faces = np.random.randint(0,100,(10,3))
F = np.roll(faces.repeat(2,axis=1),-1,axis=1)
F = F.reshape(len(F)*3,2)
F = np.sort(F,axis=1)
G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] )
G = np.unique(G)
print(G)

74. 給定一個二進位制的陣列C,如何生成一個數組A滿足np.bincount(A)==C? (★★★)

(提示: np.repeat)

# Author: Jaime Fernández del Río

C = np.bincount([1,1,2,3,4,4,6])
A = np.repeat(np.arange(len(C)), C)
print(A)

75. 如何通過滑動視窗計算一個數組的平均數? (★★★)

(提示: np.cumsum)

# Author: Jaime Fernández del Río

def moving_average(a, n=3) :
    ret = np.cumsum(a, dtype=float)
    ret[n:] = ret[n:] - ret[:-n]
    return ret[n - 1:] / n
Z = np.arange(20)
print(moving_average(Z, n=3))

76. 思考以為陣列Z,構建一個二維陣列,其第一行是(Z[0],Z[1],Z[2]), 然後每一行移動一位,最後一行為 (Z[-3],Z[-2],Z[-1]) (★★★)

(提示: from numpy.lib import stride_tricks)

# Author: Joe Kington / Erik Rigtorp
from numpy.lib import stride_tricks

def rolling(a, window):
    shape = (a.size - window + 1, window)
    strides = (a.itemsize, a.itemsize)
    return stride_tricks.as_strided(a, shape=shape, strides=strides)
Z = rolling(np.arange(10), 3)
print(Z)

77. 如何對布林值取反,或改變浮點數的符號(sign)? (★★★)

(提示: np.logical_not, np.negative)

# Author: Nathaniel J. Smith

Z = np.random.randint(0,2,100)
np.logical_not(Z, out=Z)

Z = np.random.uniform(-1.0,1.0,100)
np.negative(Z, out=Z)

78. 思考兩組點集P0P1去描述一組線(二維)和一個點p,如何計算點p到每一條線 i (P0[i],P1[i])的距離? (★★★)

def distance(P0, P1, p):
    T = P1 - P0
    L = (T**2).sum(axis=1)
    U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L
    U = U.reshape(len(U),1)
    D = P0 + U*T - p
    return np.sqrt((D**2).sum(axis=1))

P0 = np.random.uniform(-10,10,(10,2))
P1 = np.random.uniform(-10,10,(10,2))
p  = np.random.uniform(-10,10,( 1,2))
print(distance(P0, P1, p))

79. 考慮兩組點集P0P1去描述一組線(二維)和一組點集P,如何計算每一個點 j(P[j]) 到每一條線 i (P0[i],P1[i])的距離? (★★★)

# Author: Italmassov Kuanysh

# based on distance function from previous question
P0 = np.random.uniform(-10, 10, (10,2))
P1 = np.random.uniform(-10,10,(10,2))
p = np.random.uniform(-10, 10, (10,2))
print(np.array([distance(P0,P1,p_i) for p_i in p]))

80. 思考一個任意的陣列,編寫一個函式,該函式提取一個具有固定形狀的子部分,並以一個給定的元素為中心(在該部分填充值) (★★★)

(提示: minimum, maximum)

# Author: Nicolas Rougier

Z = np.random.randint(0,10,(10,10))
shape = (5,5)
fill  = 0
position = (1,1)

R = np.ones(shape, dtype=Z.dtype)*fill
P  = np.array(list(position)).astype(int)
Rs = np.array(list(R.shape)).astype(int)
Zs = np.array(list(Z.shape)).astype(int)

R_start = np.zeros((len(shape),)).astype(int)
R_stop  = np.array(list(shape)).astype(int)
Z_start = (P-Rs//2)
Z_stop  = (P+Rs//2)+Rs%2

R_start = (R_start - np.minimum(Z_start,0)).tolist()
Z_start = (np.maximum(Z_start,0)).tolist()
R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist()
Z_stop = (np.minimum(Z_stop,Zs)).tolist()

r = [slice(start,stop) for start,stop in zip(R_start,R_stop)]
z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)]
R[r] = Z[z]
print(Z)
print(R)