แยกคอลัมน์เฉพาะในอาร์เรย์ numpy


164

นี่เป็นคำถามง่าย ๆ แต่บอกว่าฉันมีเมทริกซ์ MxN สิ่งที่ฉันต้องทำคือแยกคอลัมน์ที่เฉพาะเจาะจงและเก็บไว้ในอาร์เรย์ numpy อื่น แต่ฉันได้รับข้อผิดพลาดทางไวยากรณ์ที่ไม่ถูกต้อง นี่คือรหัส:

extractedData = data[[:,1],[:,9]]. 

ดูเหมือนว่าบรรทัดข้างต้นควรจะพอเพียง แต่ฉันเดาไม่ได้ ฉันมองไปรอบ ๆ แต่ไม่พบไวยากรณ์ใด ๆ ที่ชาญฉลาดเกี่ยวกับสถานการณ์เฉพาะนี้

คำตอบ:


272

ฉันคิดว่าคุณต้องการคอลัมน์1และ9? ที่

data[:, [1, 9]]

หรือด้วยชื่อ:

data[:, ['Column Name1','Column Name2']]

คุณสามารถรับชื่อจากdata.dtype.names...


ทำอย่างไรกับชื่อคอลัมน์?
Zelphir Kaltstahl

9
data [:, ['Column Name1', 'Column Name2']]
code-assassin

มันเป็นมุมมองหรือคัดลอก? คอขวดของฉันอยู่ในบรรทัดนี้ฉันค้นหาวิธีเพิ่มประสิทธิภาพ
Fractale

1
เป็นไปได้ไหมว่าฟังก์ชั่นนี้ใช้งานไม่ได้อีกต่อไป?
PV8

ไวยากรณ์นี้เรียกว่าอะไร?
Burrito

29

สมมติว่าคุณต้องการรับคอลัมน์ 1 และ 9 ด้วยข้อมูลโค้ดนั้นควรเป็น:

extractedData = data[:,[1,9]]

14

หากคุณต้องการแยกเฉพาะบางคอลัมน์:

idx_IN_columns = [1, 9]
extractedData = data[:,idx_IN_columns]

หากคุณต้องการยกเว้นคอลัมน์เฉพาะ:

idx_OUT_columns = [1, 9]
idx_IN_columns = [i for i in xrange(np.shape(data)[1]) if i not in idx_OUT_columns]
extractedData = data[:,idx_IN_columns]

9

สิ่งหนึ่งที่ผมอยากจะชี้ให้เห็นคือถ้าจำนวนคอลัมน์ที่คุณต้องการแยกเป็น 1 เมทริกซ์ที่ได้จะไม่เป็นเมทริกซ์ Mx1อย่างที่คุณคาดไว้ แต่แทนที่จะเป็นอาร์เรย์ที่มีองค์ประกอบของคอลัมน์ที่คุณแยกออกมา

ในการแปลงเป็นเมทริกซ์ควรใช้เมธอดreshape (M, 1)ในอาร์เรย์ผลลัพธ์


2
data[:, 8:9]นอกจากนี้คุณสามารถบรรลุนี้โดยใช้ลำไส้ใหญ่เช่น นี่ใช้คอลัมน์ที่แปด แต่ไม่ได้ลบส่วนเกินพิเศษ
Jan Kukacka

data [:, 8] จะเลือกคอลัมน์ที่ 8 และส่งกลับ Mx1 Matrix
StefanMK

5

แค่:

>>> m = np.matrix(np.random.random((5, 5)))
>>> m
matrix([[0.91074101, 0.65999332, 0.69774588, 0.007355  , 0.33025395],
        [0.11078742, 0.67463754, 0.43158254, 0.95367876, 0.85926405],
        [0.98665185, 0.86431513, 0.12153138, 0.73006437, 0.13404811],
        [0.24602225, 0.66139215, 0.08400288, 0.56769924, 0.47974697],
        [0.25345299, 0.76385882, 0.11002419, 0.2509888 , 0.06312359]])
>>> m[:,[1, 2]]
matrix([[0.65999332, 0.69774588],
        [0.67463754, 0.43158254],
        [0.86431513, 0.12153138],
        [0.66139215, 0.08400288],
        [0.76385882, 0.11002419]])

คอลัมน์ไม่จำเป็นต้องเรียงตามลำดับ:

>>> m[:,[2, 1, 3]]
matrix([[0.69774588, 0.65999332, 0.007355  ],
        [0.43158254, 0.67463754, 0.95367876],
        [0.12153138, 0.86431513, 0.73006437],
        [0.08400288, 0.66139215, 0.56769924],
        [0.11002419, 0.76385882, 0.2509888 ]])

2

อีกสิ่งหนึ่งที่คุณควรใส่ใจเมื่อเลือกคอลัมน์จากอาร์เรย์ ND โดยใช้รายการดังนี้:

data[:,:,[1,9]]

ถ้าคุณต้องการถอดมิติ (โดยเลือกเพียงหนึ่งแถวตัวอย่าง) อาร์เรย์ผลจะ (ด้วยเหตุผลบางอย่าง) Permuted ดังนั้น:

print data.shape            # gives [10,20,30]
selection = data[1,:,[1,9]]
print selection.shape       # gives [2,20] instead of [20,2]!!

1

คุณสามารถใช้ได้ :

extracted_data = data.ix[:,['Column1','Column2']]


2
คำตอบที่ดีมักจะมีคำอธิบายเกี่ยวกับสิ่งที่ทำไปแล้วและทำไมมันถึงทำในลักษณะนี้ไม่เพียง แต่สำหรับ OP แต่สำหรับผู้เยี่ยมชมในอนาคต โปรดเพิ่มคำอธิบายเพื่อให้ผู้อื่นเข้าใจ
Rucha Bhatt Joshi

-1

ฉันคิดว่าวิธีแก้ปัญหาที่นี่ไม่ทำงานกับการอัพเดตของ python อีกต่อไปวิธีหนึ่งที่จะทำได้ด้วยฟังก์ชั่น python ใหม่สำหรับมันคือ:

extracted_data = data[['Column Name1','Column Name2']].to_numpy()

ซึ่งให้ผลลัพธ์ที่ต้องการ

เอกสารที่คุณสามารถหาได้ที่นี่: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy


คำถามเริ่มต้นด้วยอาร์เรย์ numpy ไม่ใช่ dataframe
TMrtSmith

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.