Repmat ของ MATLAB ที่เทียบเท่าใน NumPy คืออะไร


103

ฉันต้องการที่จะดำเนินการเทียบเท่าของรหัส MATLAB ไปนี้การใช้ NumPy repmat([1; 1], [1 1 1])นี้: ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?

คำตอบ:


104

นี่คือลิงค์NumPy (อย่างเป็นทางการ) ที่ดีกว่าสำหรับผู้ใช้ Matlab - ฉันกลัวว่า mathesaurus จะค่อนข้างล้าสมัย

เทียบเท่า numpy ของมีrepmat(a, m, n)tile(a, (m, n))

สิ่งนี้ใช้ได้กับหลายมิติและให้ผลลัพธ์ที่คล้ายกันกับ matlab (Numpy ให้อาร์เรย์เอาต์พุต 3 มิติตามที่คุณคาดหวัง - matlab ด้วยเหตุผลบางประการให้เอาต์พุต 2d - แต่เนื้อหาเหมือนกัน)

Matlab:

>> repmat([1;1],[1,1,1])

ans =
     1
     1

Python:

In [46]: a = np.array([[1],[1]])
In [47]: np.tile(a, [1,1,1])
Out[47]: 
array([[[1],
        [1]]])

2
เมื่อฉันลองขนาด (repmat ([1; 1], [1,1,2])) จะได้รับ ans = 2 1 2 [ใน matlab] แต่ใน python np.tile (a, [1,1,2]) .shape it get (1, 2, 2), I want numpy ให้ผลลัพธ์เหมือนกับ matlab
vernomcrp

2
np.tile (a [:, np.newaxis], [1,1,2]) - ให้เหมือนกัน ปัญหาคือไทล์ส่งเสริมaมิติของอาร์กิวเมนต์ไทล์โดยกำหนดแกนใหม่ล่วงหน้าตามความจำเป็น Matlab ดูเหมือนจะทำงานในทางอื่น ในทำนองเดียวกันด้วยการปูกระเบื้อง 4d คุณจะต้องใช้แกนใหม่สองครั้ง ... ดังนั้นnp.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))ตามความจำเป็น ...
rob ตั้งแต่

17

โปรดทราบว่าเหตุผลบางประการที่คุณต้องใช้ repmat ของ MATLAB ได้รับการดูแลโดยกลไกการแพร่ภาพของ NumPy ซึ่งช่วยให้คุณสามารถคำนวณทางคณิตศาสตร์ประเภทต่างๆที่มีอาร์เรย์ที่มีรูปร่างคล้ายกันได้ ดังนั้นถ้าคุณมีอาร์เรย์ 1600x1400x3 ที่แสดงภาพ 3 สีคุณสามารถ (แบบเรียงตามลำดับ) คูณด้วย[1.0 0.25 0.25]เพื่อลดจำนวนสีเขียวและสีน้ำเงินในแต่ละพิกเซล ดูลิงค์ด้านบนสำหรับข้อมูลเพิ่มเติม


2
ไม่ว่า Matlab bsxfunสามารถทำเช่นนี้ออกอากาศเช่นกันถ้าคุณใช้
gerrit


8

นี่คือวิธีที่ฉันเข้าใจมันจากการเล่นซอ ยินดีที่ได้รับการแก้ไขและหวังว่านี่จะช่วยได้

สมมติว่าคุณมีเมทริกซ์Mขององค์ประกอบ 2x3 นี่มีสองมิติชัด ๆ


ฉันไม่เห็นความแตกต่างระหว่าง Matlab และ Python ในขณะที่ขอให้จัดการเมทริกซ์อินพุตตามขนาดที่เมทริกซ์มีอยู่แล้ว ดังนั้นสองคำสั่ง

repmat(M,m,n) % matlab

np.tile(M,(m,n)) # python

เทียบเท่ากับเมทริกซ์ของอันดับ 2 (สองมิติ)


เรื่องนี้จะสวนทางกับสัญชาตญาณเมื่อคุณขอการทำซ้ำ / การเรียงลำดับในมิติที่มากกว่าที่เมทริกซ์อินพุตมี ย้อนกลับไปที่เมทริกซ์ M ของอันดับสองและรูปร่าง 2x3 ก็เพียงพอแล้วที่จะดูว่าเกิดอะไรขึ้นกับขนาด / รูปร่างของเมทริกซ์เอาต์พุต สมมติว่าลำดับการจัดการตอนนี้คือ 1,1,2

ใน Matlab

> size(repmat(M,1,1,2))
ans =

    2   3   2

มันได้คัดลอกสองมิติแรก (แถวและคอลัมน์) ของเมทริกซ์อินพุตและทำซ้ำอีกครั้งในมิติที่สามใหม่ (คัดลอกสองครั้งนั่นคือ) เป็นจริงกับการตั้งชื่อrepmatเมทริกซ์ซ้ำ

ใน Python

>>> np.tile(M,(1,1,2)).shape
(1, 2, 6)

มันได้ใช้ขั้นตอนที่แตกต่างออกไปเนื่องจากฉันคิดว่าลำดับ (1,1,2) อ่านต่างจากใน Matlab จำนวนสำเนาในทิศทางของคอลัมน์แถวและขนาดนอกระนาบกำลังถูกอ่านจากขวาไปซ้าย วัตถุที่ได้จะมีรูปร่างแตกต่างจาก Matlab เราไม่สามารถยืนยันได้อีกต่อไปrepmatและtileเป็นคำแนะนำที่เทียบเท่ากัน


เพื่อให้ได้tileพฤติกรรมเช่นrepmatใน Python เราต้องตรวจสอบให้แน่ใจว่าเมทริกซ์อินพุตมีมิติข้อมูลมากพอ ๆ กับองค์ประกอบที่อยู่ในลำดับ ตัวอย่างเช่นโดยการปรับสภาพล่วงหน้าเล็กน้อยและสร้างวัตถุที่เกี่ยวข้องN

N = M[:,:,np.newaxis]

จากนั้นที่ด้านอินพุตจะมีN.shape = (2,3,1)มากกว่าM.shape = (2,3)และที่ด้านเอาต์พุต

>>> np.tile(N,(1,1,2)).shape
(2, 3, 2)

size(repmat(M,1,1,2))ซึ่งเป็นคำตอบของ ฉันคิดว่านี่เป็นเพราะเราได้แนะนำ Python ให้เพิ่มมิติที่สามทางด้านขวาของ (2,3) แทนที่จะเป็นทางซ้ายเพื่อให้ Python ทำงานตามลำดับ (1,1,2) ตามที่ตั้งใจไว้ใน Matlab วิธีการอ่าน

องค์ประกอบใน[:,:,0]ในคำตอบที่งูหลามNจะมีค่าเช่นเดียวกับองค์ประกอบ(:,:,1)คำตอบสำหรับ Matlab M


ในที่สุดฉันก็ไม่สามารถหาสิ่งที่เทียบเท่าได้repmatเมื่อมีคนใช้ผลิตภัณฑ์ Kronecker จาก

>>> np.kron(np.ones((1,1,2)),M).shape
(1, 2, 6)

เว้นแต่ฉันจะกำหนดเงื่อนไขเบื้องต้นMเป็นNตามข้างบน np.newaxisดังนั้นผมจะเถียงว่าวิธีทั่วไปมากที่สุดที่จะไปคือการใช้วิธีการของ


เกมจะยุ่งยากขึ้นเมื่อเราพิจารณาเมทริกซ์Lของอันดับ 3 (สามมิติ) และกรณีง่ายๆที่ไม่มีการเพิ่มมิติใหม่ในเมทริกซ์เอาต์พุต คำสั่งที่ดูเหมือนจะเหมือนกันสองคำสั่งนี้จะไม่ให้ผลลัพธ์เหมือนกัน

repmat(L,p,q,r) % matlab

np.tile(L,(p,q,r)) # python

เนื่องจากแถวคอลัมน์ทิศทางนอกระนาบคือ (p, q, r) ใน Matlab และ (q, r, p) ใน Python ซึ่งไม่สามารถมองเห็นได้ด้วยอาร์เรย์อันดับ 2 ที่นั่นเราต้องระวังและการได้ผลลัพธ์เดียวกันกับสองภาษานั้นจะต้องมีการปรับสภาพล่วงหน้ามากขึ้น


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




0
>>> import numpy as np

>>> np.repeat(['a','b'], [2,5])

array(['a', 'a', 'b', 'b', 'b', 'b', 'b'], dtype='<U1')

>>> np.repeat([1,2], [2,5])

array([1, 1, 2, 2, 2, 2, 2])

>>> np.repeat(np.array([1,2]), [3]).reshape(2,3)

array([[1, 1, 1],
       [2, 2, 2]])

>>> np.repeat(np.array([1,2]), [2,4]).reshape(3,2)

array([[1, 1],
       [2, 2],
       [2, 2]])

>>> np.repeat(np.matrix('1 2; 3 4'), [2]).reshape(4,2)

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