নম্পি: প্রতিটি সারি একটি ভেক্টর উপাদান দ্বারা ভাগ করুন


119

ধরুন আমার কাছে একটি অলপ অ্যারে রয়েছে:

data = np.array([[1,1,1],[2,2,2],[3,3,3]])

এবং আমার একটি অনুরূপ "ভেক্টর:" আছে

vector = np.array([1,2,3])

dataবিয়োগ বা বিভক্ত করার জন্য আমি কীভাবে প্রতিটি সারি ধরে পরিচালনা করব যাতে ফলাফলটি হয়:

sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]

দীর্ঘ গল্প সংক্ষিপ্ত: আমি কীভাবে প্রতিটি সারিটির সাথে মিল রেখে স্কেলারার 1D অ্যারে সহ 2 ডি অ্যারের প্রতিটি সারিটিতে একটি অপারেশন করব?

উত্তর:


181

আপনি এখানে যান। আপনাকে কেবল সম্প্রচারের সাথে মিলিত None(বা বিকল্পভাবে np.newaxis) ব্যবহার করতে হবে :

In [6]: data - vector[:,None]
Out[6]:
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

In [7]: data / vector[:,None]
Out[7]:
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])



@ ব্যবহারকারী 108569 নাম্পির সর্বশেষ সংস্করণ (1.18.1) ব্যবহার করে Noneএখনও সমানভাবে কাজ করে np.newaxis। আমি নিশ্চিত না যে আপনার সেটআপটি কী, বা আপনি যে সঠিক সমস্যাটির মুখোমুখি হচ্ছেন, তবে উত্তরটি এখনও বৈধ।
জোশআদেল

11

যেমনটি উল্লেখ করা হয়েছে, এর সাথে Noneবা এর সাথে কাটা কাটানো np.newaxesএটি করার একটি দুর্দান্ত উপায়। অন্য বিকল্প হ'ল হিসাবে, স্থানান্তর এবং সম্প্রচার ব্যবহার করা

(data.T - vector).T

এবং

(data.T / vector).T

উচ্চ মাত্রিক অ্যারেগুলির জন্য আপনি swapaxesNumPy অ্যারে বা NumPy rollaxisফাংশনটি ব্যবহার করতে পারেন । এটি করার জন্য অনেক উপায় আছে।

সম্প্রচারের পরিপূর্ণ ব্যাখ্যার জন্য, http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html দেখুন


4

জোশএডেলের সমাধানটি একটি মাত্রা যুক্ত করতে np.newaxis ব্যবহার করে। একটি বিকল্প ব্যবহার করা সম্প্রচার প্রস্তুতি মাত্রা সারিবদ্ধ পুনর্নির্মাণ ()

data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])

data
# array([[1, 1, 1],
#        [2, 2, 2],
#        [3, 3, 3]])
vector
# array([1, 2, 3])

data.shape
# (3, 3)
vector.shape
# (3,)

data / vector.reshape((3,1))
# array([[1, 1, 1],
#        [1, 1, 1],
#        [1, 1, 1]])

পুনর্নির্মাণ () পুনরায় সম্পাদন করার ফলে সম্প্রচারের জন্য মাত্রাগুলি সীমাবদ্ধ হতে দেয়:

data:            3 x 3
vector:              3
vector reshaped: 3 x 1

মনে রাখবেন যে data/vectorএটি ঠিক আছে, তবে এটি আপনি চান এমন উত্তর পান না। এটা প্রতিটি ভাগ কলাম এর array(প্রতিটি পরিবর্তে সারি প্রতিটি সংশ্লিষ্ট উপাদান দ্বারা) vector। এটা তোলে আপনি যদি সুস্পষ্টরূপে রূপ আপনি পেতে হবে কি vectorহতে 1x3পরিবর্তে 3x1

data / vector
# array([[1, 0, 0],
#        [2, 1, 0],
#        [3, 1, 1]])
data / vector.reshape((1,3))
# array([[1, 0, 0],
#        [2, 1, 0],
#        [3, 1, 1]])

2

পাইথোনিক উপায় এটি করার জন্য ...

np.divide(data.T,vector).T

এটি পুনরায় আকার দেওয়ার ক্ষেত্রে যত্ন নেয় এবং ফলাফলগুলি ভাসমান পয়েন্ট ফর্ম্যাটে থাকে। অন্যান্য উত্তরে ফলাফলগুলি পূর্ণসংখ্যার বিন্যাসে হয়।

# নোট: উভয় ডেটা এবং ভেক্টরের কলামের মিল থাকা উচিত


দ্রষ্টব্য: ওপি যা অনুরোধ করছে তা তা করে না। শেষ ফলাফলটি অ্যারে ([[1।, 0.5, 0.33333333]], [2., 1., 0.66666667], [3., 1.5, 1.]])। এটি 'পাইথোনিক' হতে পারে তবে এটি ভুল।
মার্ক ক্রমার

1
@ মার্কক্র্যামার আপনাকে ধন্যবাদ। সঠিক উত্তর দেওয়ার জন্য আমি আমার উত্তরটি সংশোধন করেছি।
শান্তনু পাঠক

1

সাধারণ ক্ষেত্রে আপনি কেবল ব্যবহার করতে পারেন স্ট্যাকওভারফ্লুউজার 2010 এর উত্তরে যুক্ত করা

data = np.array([[1,1,1],[2,2,2],[3,3,3]])

vector = np.array([1,2,3])

data / vector.reshape(-1,1)

এটি আপনার ভেক্টরটিকে একটিতে পরিণত করবে column matrix/vector। আপনার ইচ্ছে মতো আপনাকে এলিমেন্টওয়ালা ক্রিয়াকলাপ করার অনুমতি দিচ্ছে। আমার পক্ষে কমপক্ষে, এটি সবচেয়ে স্বজ্ঞাত উপায় এটি সম্পর্কে এবং এটি যেহেতু (বেশিরভাগ ক্ষেত্রে) নমপি কেবল একই অভ্যন্তরীণ মেমরির একটি দৃষ্টিভঙ্গি পুনরায় আকার দেওয়ার জন্য এটি কার্যকর।


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এর সাথে একটি কলাম ভেক্টর তৈরি করা .reshape(-1,1) সম্প্রচারটি ব্যবহারের সবচেয়ে স্বজ্ঞাত উপায়।
পল রৌজিক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.