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