亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據另一個數組的元素復制數組的元素?

如何根據另一個數組的元素復制數組的元素?

叮當貓咪 2022-10-18 16:11:27
pop=np.zeros((population_size,chromosome_length))for i in range(population_size):    for j in range(i,chromosome_length):        pop[i,j] = random.randint(0, 1)        poparray([[0., 1., 0., 1., 1., 1., 0., 0., 1., 1.],       [0., 0., 1., 0., 1., 0., 1., 1., 0., 0.],       [0., 0., 1., 0., 0., 1., 1., 0., 0., 1.],       [0., 0., 0., 0., 1., 0., 1., 1., 1., 0.],       [0., 0., 0., 0., 1., 0., 1., 1., 0., 1.],       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.]])我有另一個數組expected,由未顯示的代碼生成,示例如下:array([[1.99214608],       [1.45140389],       [0.07068525],       [0.69507167],       [1.08384057],       [0.70685254]])然后,我想expected根據自定義間隔對 的值進行分類:actual=np.zeros((population_size,1))for i in range(len(expected)):    if expected[i]>=1.5:        actual[i]=2    elif 1.5>expected[i]>=0.9:        actual[i]=1    else:        actual[i]=0actual=actual.astype(int)   total_count=int(np.sum(actual))print(total_count)[[2] [1] [0] [0] [1] [0]] 4我希望最終輸出為:array([[0., 1., 0., 1., 1., 1., 0., 0., 1., 1.],       [0., 1., 0., 1., 1., 1., 0., 0., 1., 1.],       [0., 0., 1., 0., 1., 0., 1., 1., 0., 0.],       [0., 0., 0., 0., 1., 0., 1., 1., 0., 1.]])基于 中的值total_count。第一行pop被復制兩次,第二行一次,第五行一次。簡而言之,我想要的是基于另一個數組的整數元素重復/復制/復制數組的元素。
查看完整描述

1 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

當您使用 NumPy 數組時,我將嘗試在部分中解決這個問題,就好像它們是列表一樣,因此首先失去了庫的很多目的。盡管語法更加緊湊,但它帶來了顯著的速度提升。

創造人口

這個很簡單。我們可以直接替換生成pop使用numpy.random.randint。我們需要為 和 指定值population_sizechromosome length使用這些值來指定輸出大小。

population_size = 6
chromosome_length = 10
pop = np.random.randint(0, 2, (population_size, chromosome_length))

注意:這不會給出與您在實際問題中包含的完全相同的值,因為我們沒有為隨機數生成器設置種子。但是,代碼直接等效于您的for循環,但性能更高。

生成expected

我無法準確替換本節,因為替換你的循環太多了,一些變量也未定義。所以,我只是假設我將獲得與您顯示的相同的二維數組:

expected = np.array([[1.99214608],
                     [1.45140389],
                     [0.07068525],
                     [0.69507167],
                     [1.08384057],
                     [0.70685254]])

分箱數據

這有點復雜。我們可以利用numpy.digitize在您的區間(0、0.9 和 1.5)之間對數據進行分類。但是,此方法不適用于 2D 數組,因此我將首先使用numpy.ravel()展平數組。

這將返回每個值expected所屬的 bin 標識列表。但是,bin 標識從 1 開始,我們希望將這些值用作數組的索引,因此我還將同時從結果中減去 1。

bins = np.array([0, 0.9, 1.5])
dig = np.digitize(expected.ravel(), bins) - 1

最后的步驟

我將創建一個與 bin 類別相對應的值數組。然后我們可以使用相應的替換值numpy.take來替換 的值。dig

replacements = np.array([0, 1, 2])
actual = np.take(replacements, dig)

最后:),我們可以使用numpy.repeatusingactual以正確的比例獲取行pop來構建輸出。

最終代碼

import numpy as np


population_size = 6

chromosome_length = 10


pop = np.random.randint(0, 2, (population_size, chromosome_length))


# But I'm going to deliberately overwrite the above to solve your particular case

pop = np.array([[0., 1., 0., 1., 1., 1., 0., 0., 1., 1.],

                [0., 0., 1., 0., 1., 0., 1., 1., 0., 0.],

                [0., 0., 1., 0., 0., 1., 1., 0., 0., 1.],

                [0., 0., 0., 0., 1., 0., 1., 1., 1., 0.],

                [0., 0., 0., 0., 1., 0., 1., 1., 0., 1.],

                [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.]])



# Hard-coded :/

expected = np.array([[1.99214608],

                     [1.45140389],

                     [0.07068525],

                     [0.69507167],

                     [1.08384057],

                     [0.70685254]])


bins = np.array([0, 0.9, 1.5])

dig = np.digitize(expected.ravel(), bins) - 1


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

actual = np.take(replacements, dig)


out = np.repeat(pop, actual, axis=0)

print(out)

給出:


[[0. 1. 0. 1. 1. 1. 0. 0. 1. 1.]

 [0. 1. 0. 1. 1. 1. 0. 0. 1. 1.]

 [0. 0. 1. 0. 1. 0. 1. 1. 0. 0.]

 [0. 0. 0. 0. 1. 0. 1. 1. 0. 1.]]


查看完整回答
反對 回復 2022-10-18
  • 1 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號