Python 我自己寫了個把list擴大的函式,很繁瑣,請問有自帶的函式或者庫干這個嗎?

時間 2021-05-29 23:38:28

1樓:etnAtker

線性插值的話一行大概就可以[(a

[i+1

]-a[

i])/n

*j+a

[i]foriin

range

(len(a

)-1)

forj

inrange(n

)]+[a

[-1]]

a是原列表,n是分段點個數。這樣寫會重複計算n次(a[i + 1] - a[i]) / n * j,會有效能損失。要是要求效能,可以考慮把(a[i + 1] - a[i]) / n * j單獨生成乙個列表,然後再呼叫那個列表的值生成最終的列表。效果:

2樓:shyakocat

#將陣列a的元素插值擴充到n個,其中陣列a的元素個數和n都要求不少於2

defscale(a

,n):return[a

[0]]+

[a[int(v

)]*(1

-(v-

int(

v)))+a

[int(v

)+1]

*(v-

int(v))

forv

inmap

(lambdai:

i/(n

-1)*

(len(a

)-1),

range(1

,n-1

))]+[a

[-1]]

a=[3500

,2500

,2000

,3500

,4000

,6000

,4000]b

=scale(a

,155

)print(b

)這個問題大致等價於一維函式的座標軸縮放。

3樓:6011

應該不用使用插值。

import

numpy

asnp

arr=np.

array

([10,8

,7,1

,2,43

,1])# y軸x=

np.array([1

,2,3

,4,5

,6,7

])x=x

*155/7

import

matplotlib.pyplot

asplt

plt.

plot(x

,arr

)plt

.show()

4樓:忘憂北萱草

如果只是個線性插值,為什麼不用迭代器呢?

definterp

(arr,m

):# m 表示擴大的倍數

iflen

(arr

)<=1:

yield

from

arrreturn

# return iter(arr) # 原先的錯誤寫法,感謝「陳宇軒1」指正

fori

inrange

(len

(arr)-

1):forp

inrange(m

):yield

arr[i]

*(1-

p/m)

+arr[i

+1]*

(p/m

)yield

arr[-1

]print

(list

(interp

([1000

,3000

,2000],5

)))# [1000.0, 1400.0, 1800.

0, 2200.0, 2600.0, 3000.

0, 2800.0, 2600.0, 2400.

0, 2200.0, 2000]

又省記憶體又便於編寫,非常 pythonic。

如果想要列表,套一層 list 函式就好了。

5樓:冒泡

>>> l = [3500, 2500, 2000, 3500, 4000, 6000, 4000]

>>> for i in xrange(len(l) - 1, 0, -1l[i - 1 : i] = range(l[i - 1], l[i], (l[i] - l[i - 1]) / 26)

...>>> l

[3500, 3461, 3422, 3383, 3344, 3305, 3266, 3227, 3188, 3149, 3110, 3071, 3032, 2993, 2954, 2915, 2876, 2837, 2798, 2759, 2720, 2681, 2642, 2603, 2564, 2525, 2500, 2480, 2460, 2440, 2420, 2400, 2380, 2360, 2340, 2320, 2300, 2280, 2260, 2240, 2220, 2200, 2180, 2160, 2140, 2120, 2100, 2080, 2060, 2040, 2020, 2000, 2057, 2114, 2171, 2228, 2285, 2342, 2399, 2456, 2513, 2570, 2627, 2684, 2741, 2798, 2855, 2912, 2969, 3026, 3083, 3140, 3197, 3254, 3311, 3368, 3425, 3482, 3500, 3519, 3538, 3557, 3576, 3595, 3614, 3633, 3652, 3671, 3690, 3709, 3728, 3747, 3766, 3785, 3804, 3823, 3842, 3861, 3880, 3899, 3918, 3937, 3956, 3975, 3994, 4000, 4076, 4152, 4228, 4304, 4380, 4456, 4532, 4608, 4684, 4760, 4836, 4912, 4988, 5064, 5140, 5216, 5292, 5368, 5444, 5520, 5596, 5672, 5748, 5824, 5900, 5976, 6000, 5923, 5846, 5769, 5692, 5615, 5538, 5461, 5384, 5307, 5230, 5153, 5076, 4999, 4922, 4845, 4768, 4691, 4614, 4537, 4460, 4383, 4306, 4229, 4152, 4075, 4000]

>>>你155個點本來也做不到均勻填充,因為整數除法的問題我這每一段也不是等數量的,大概就這麼個演算法的意思

6樓:

import random

import numpy as np

from scipy.interpolate import interp1d

import matplotlib.pyplot as plt

x = np.linspace(0, 6, num=7, endpoint=True)

xnew = np.linspace(0, 6, num=155, endpoint=True)

y = random.sample(range(2000, 6000), 7)

print(y)

f = interp1d(x, y)

print(list(f(xnew)))

plt.figure()

plt.subplot(2, 1, 1)

plt.plot(x, y, "o")

plt.subplot(2, 1, 2)

plt.plot(f(xnew), ".")

plt.show()

這樣可以嗎?

7樓:useprxf

你是要固定生成155個點並且不改變原有7個點是吧?可以計算下每一段需要插入幾個點,然後進行線性插值。實現方式如下:

definterpn(l

,n):res=

fori

inrange(1

,len(l

)):# 計算 [l[i], l[i+1]) 中要取幾個點,注意左閉右開k=

(n-1

)*i//

(len(l

)-1)

-(n-

1)*(

i-1)

//(len(l)

-1)# 線性插值

res+=[l

[i-1

]+(l

[i]-

l[i-

1])*j

/kforj

inrange(0

,k)]# 將最後一點補上

return

res+[l

[-1]]

print

(interpn([1

,2,3

],6))interpn也可以壓縮成一句話來寫,只是會比較長,可讀性不高

8樓:黑洞電網

我大概看懂了你的意思。你要把這7個點變成155個點,而使轉變後的155個點的分布和7個點的分布保持乙個形狀,不知道是不是。

本來的1個單位長度現在要隱射成26(155/6)個單位長度。而這26個單位長度上的所有點,連起來要和對應的原來的兩個點之間的連線的「變化程度」一致。

那你看看可不可以寫個函式。這個函式首先算原來的每一段的斜率(一共6個),然後除以26求得新的斜率(也是6個),然後依次算截距,最後把1-155這155個「x」代入直線方程,求得座標後放入乙個新的列表作為返回值。

Python裡面列表是可變型別,所以把列表(以及字典,集合)作為函式引數的時候要特別注意,因為函式是會在原來列表上就著改的。如果你不想改原來的列表,稍微保險一點的做法是用下copy():

deffunc(ls

):ls_backup=ls

.copy

()# ...

自學 Python,用 django 它寫了小貼吧,投簡歷都沒有回應,是簡歷還是能力問題?

趙毓軒 覺得Python其實像英語一樣的,是乙個輔助技能。好比我是做訊號處理的,用這個東西來做訊號分析很好使,老闆要乙個互動介面也能用Django做出來。然鵝並不能指望用這個來吃飯,但是會了這個能給自身的工作給予很大的幫助.其實說實話,找工作還是看的是核心競爭力.會他人所不會,長他人所不長,找工作這...

用Python寫了個函式,解決酒瓶換酒的問題,求大牛們指點?(問題已解決,感謝各位!)

不得不說 在這種題目給定的條件裡就隱含了乙個核心 一瓶酒,酒水,瓶子,瓶蓋都帶有了貨幣屬性。賒一瓶酒。實際是,貸款了。貸款包括,一酒水,一瓶子,一蓋子。瓶子,蓋子不屬於你。不能再拿瓶子,蓋子去換一整瓶酒。再清楚地說一次。好比貸款總共A 其中包括A1酒A2瓶子A3蓋子。先貸款A,然後拿其中的A2和A3...

婚前買房,合同寫了我自己名字,婚後辦理房產證,這麼算?

律法道陳志強 1 對!一般的購房流程是先簽署 房產認購書 這時候寫誰的名字都無所謂,之後會再跟開發商簽署真正的 房屋買賣合同 這時候就要注意了,這時候選擇了寫誰了名字以後的房產證就會寫誰的名字。對於此時是否變更產權人這個問題,也曾經有當事人問過,因此,曾詢問過在開發商的內部員工,如果此時實在想要變更...