ฉันต้องการที่จะดำเนินการเทียบเท่าของรหัส MATLAB ไปนี้การใช้ NumPy repmat([1; 1], [1 1 1])
นี้: ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?
ฉันต้องการที่จะดำเนินการเทียบเท่าของรหัส MATLAB ไปนี้การใช้ NumPy repmat([1; 1], [1 1 1])
นี้: ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?
คำตอบ:
นี่คือลิงค์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]]])
a
มิติของอาร์กิวเมนต์ไทล์โดยกำหนดแกนใหม่ล่วงหน้าตามความจำเป็น Matlab ดูเหมือนจะทำงานในทางอื่น ในทำนองเดียวกันด้วยการปูกระเบื้อง 4d คุณจะต้องใช้แกนใหม่สองครั้ง ... ดังนั้นnp.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))
ตามความจำเป็น ...
โปรดทราบว่าเหตุผลบางประการที่คุณต้องใช้ repmat ของ MATLAB ได้รับการดูแลโดยกลไกการแพร่ภาพของ NumPy ซึ่งช่วยให้คุณสามารถคำนวณทางคณิตศาสตร์ประเภทต่างๆที่มีอาร์เรย์ที่มีรูปร่างคล้ายกันได้ ดังนั้นถ้าคุณมีอาร์เรย์ 1600x1400x3 ที่แสดงภาพ 3 สีคุณสามารถ (แบบเรียงตามลำดับ) คูณด้วย[1.0 0.25 0.25]
เพื่อลดจำนวนสีเขียวและสีน้ำเงินในแต่ละพิกเซล ดูลิงค์ด้านบนสำหรับข้อมูลเพิ่มเติม
bsxfun
สามารถทำเช่นนี้ออกอากาศเช่นกันถ้าคุณใช้
ดูNumPy สำหรับผู้ใช้
Matlab:
repmat(a, 2, 3)
Numpy:
numpy.kron(numpy.ones((2,3)), a)
Matlib ใน Numpy ( numpy.matlib.repmat () ):
numpy.matlib.repmat(a, 2, 3)
นี่คือวิธีที่ฉันเข้าใจมันจากการเล่นซอ ยินดีที่ได้รับการแก้ไขและหวังว่านี่จะช่วยได้
สมมติว่าคุณมีเมทริกซ์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 ที่นั่นเราต้องระวังและการได้ผลลัพธ์เดียวกันกับสองภาษานั้นจะต้องมีการปรับสภาพล่วงหน้ามากขึ้น
ฉันทราบดีว่าการใช้เหตุผลนี้อาจไม่ใช่เรื่องทั่วไป แต่ฉันสามารถแก้ไขได้ในระยะนี้ หวังว่าสิ่งนี้จะเชิญชวนเพื่อนคนอื่น ๆ ให้ทำการทดสอบที่ยากขึ้น
รู้ทั้งสองอย่างtile
และrepeat
.
x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(2)
numpy.matlib มีฟังก์ชันrepmat ที่มีอินเทอร์เฟซคล้ายกับฟังก์ชัน matlab
from numpy.matlib import repmat
repmat( np.array([[1],[1]]) , 1, 1)
>>> 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]])