আমি কীভাবে নম্পি অ্যারেতে নতুন মাত্রা যুক্ত করতে পারি?


93

আমি একটি চিত্রের একটি অলস অ্যারে দিয়ে শুরু করছি।

In[1]:img = cv2.imread('test.jpg')

আকৃতিটি আপনি 640x480 আরজিবি চিত্রের জন্য আশা করতে পারেন।

In[2]:img.shape
Out[2]: (480, 640, 3)

তবে, আমার কাছে থাকা এই চিত্রটি একটি ভিডিওর ফ্রেম, যা 100 ফ্রেম দীর্ঘ mes আদর্শভাবে, আমি একটি একক অ্যারে রাখতে চাই যাতে এই ভিডিওর সমস্ত ডেটা যেমন এমন img.shapeফিরে আসে (480, 640, 3, 100)

পরের ফ্রেমটি যুক্ত করার সর্বোত্তম উপায় কী - তা হল, আমার প্রাথমিক অ্যারেতে ইমেজ ডেটার পরবর্তী সেট, আরও 480 x 640 x 3 অ্যারে -?

উত্তর:


105

আপনি কীভাবে একটি নুমপি অ্যারেতে একটি মাত্রা যুক্ত করবেন তা জিজ্ঞাসা করছেন, যাতে সেই মাত্রাটি তখন নতুন ডেটা সমন্বিত করার জন্য বাড়ানো যায়। একটি মাত্রা নিম্নরূপ যুক্ত করা যেতে পারে:

image = image[..., np.newaxis]

10
বর্তমানে (ফাইলটিতে ) numpy.newaxisহিসাবে সংজ্ঞায়িত করা হয়েছে , সুতরাং সমানভাবে আপনি you চিত্র = চিত্র [..., কিছুই নয়] ব্যবহার করতে পারেন। Nonenumeric.py
রায়

60
ব্যবহার করবেন না Nonenp.newaxisসুস্পষ্ট বর্ণনামূলক চেয়ে ভাল ভাল ব্যবহার করুন ।
নীল জি

7
কিভাবে এটা পারব? Noneকিছু বোঝায় না। এটা স্পষ্ট। এটা হয় None। স্পষ্টভাবে স্থির। None হয় একটি জিনিস পাইথন হবে। কোন সন্দেহ নেই. Noneসর্বশেষ বিবরণ, আপনি আরও গভীরতর যেতে পারবেন না। অন্যদিকে, numpy.newaxisবোঝা None। এটি মূলত None,। এটা হয় None। কিন্তু Noneস্পষ্টতই হয়। এটি Noneসরাসরি হিসাবে প্রকাশিত হয় না যদিও Noneস্পষ্ট এবং বিশদভাবে স্পষ্টভাবে বিবৃত, বিভ্রান্তি বা সন্দেহের কোনও জায়গা ছাড়েনি। অন্তর্ভুক্ত প্রস্তাবিত যদিও সরাসরি প্রকাশ করা হয়নি। আমাকে অবশ্যই যুক্ত করতে হবে, এটিপিআই দৃষ্টিকোণ থেকে এটি ব্যবহার করা নিরাপদ numpy.newaxis
পেড্রো রডরিগস

4
এখানে অনুমান করুন, সুস্পষ্ট হওয়া সিনট্যাক্টিকাল / শব্দার্থিক স্বচ্ছতার পরিবর্তে "কোডার অভিপ্রায়" বোঝায়।
গ্যাবার

এই ক্ষেত্রে জোশএডেলের উত্তরটি সঠিক উত্তর হিসাবে নির্বাচন করা উচিত এবং আরও বেশি ভোটের প্রয়োজন। তাঁর বক্তব্যটি তাৎপর্যপূর্ণ যে ওপিকে যেতে যেতে উচ্চতর মাত্রার এনপ্যারিতে যুক্ত করতে চাইছে। একবার তৈরি হয়ে গেলে নাদারের আকারে বাড়ানো যায় না, একটি অনুলিপি তৈরি করতে হবে। এই উত্তরটি কেবল আকারটি তৈরি করবে (480, 640, 3, 1) এবং প্রতিবার আপনি একটি নতুন ফ্রেম যুক্ত করবেন আপনি অন্য একটি অনুলিপি তৈরি করবেন। ভাল না.
ড্যান বোশেন

61

বিকল্পভাবে

image = image[..., np.newaxis]

মধ্যে @dbliss 'উত্তর , এছাড়াও আপনি ব্যবহার করতে পারেন numpy.expand_dimsমত

image = np.expand_dims(image, <your desired dimension>)

উদাহরণস্বরূপ (উপরের লিঙ্ক থেকে নেওয়া):

x = np.array([1, 2])

print(x.shape)  # prints (2,)

তারপর

y = np.expand_dims(x, axis=0)

উৎপাদনের

array([[1, 2]])

এবং

y.shape

দেয়

(1, 2)

নতুন মাত্রায় মান যুক্ত করবেন কীভাবে? যদি আমি y[1,0]এটি করি তবে ত্রুটির বাইরে থাকা সূচকটি দেয়। y[0,1]অ্যাক্সেসযোগ্য
ওয়েমা

@ ওয়াইমা: আপনি কী পরেছেন তা পুরোপুরি নিশ্চিত নয়। আপনার কাঙ্ক্ষিত ফলাফল কি?
ক্লাব

25

আপনি ঠিক সামনের দিকে সঠিক আকারের একটি অ্যারে তৈরি করতে এবং এটি পূরণ করতে পারেন:

frames = np.empty((480, 640, 3, 100))

for k in xrange(nframes):
    frames[:,:,:,k] = cv2.imread('frame_{}.jpg'.format(k))

যদি ফ্রেমগুলি পৃথক jpg ফাইল ছিল যা কিছু নির্দিষ্ট উপায়ে নামকরণ করা হয়েছিল (উদাহরণস্বরূপ, ফ্রেম_0.jpg, ফ্রেম_1.jpg, ইত্যাদি)।

কেবলমাত্র একটি নোট, আপনি (nframes, 480,640,3)পরিবর্তে একটি আকৃতির অ্যারে ব্যবহার বিবেচনা করতে পারেন ।


4
আমার মনে হয় এটিই যাওয়ার পথ। আপনি যদি কনটেন্টেশন ব্যবহার করেন তবে প্রতিবার এটি যুক্ত করার সময় আপনাকে অ্যারে মেমরিতে স্থানান্তর করতে হবে। 100 ফ্রেমের জন্য যা মোটেও গুরুত্বপূর্ণ নয়, তবে আপনি যদি বড় ভিডিওতে যেতে চান। বিটিডাব্লু, আমি ফ্রেমগুলির সংখ্যাটি প্রথম মাত্রা হিসাবে ব্যবহার করতে পারতাম যাতে একটি (100,480,640,3) অ্যারে থাকে যাতে আপনি পৃথক ফ্রেমগুলিতে অ্যাক্সেস করতে পারেন (সাধারণত কী চান আপনি সঠিকভাবে দেখতে চান)? (এফ [1 ] এফ [:,:,,, 1]) এর পরিবর্তে অবশ্যই পারফরম্যান্স অনুযায়ী এটি মোটেই বিবেচনা করা উচিত নয়।
ম্যাজেল্লান

আমি জোশএডেল এবং ম্যাগেলান ৮৮ এর সাথে একমত, অন্য উত্তরগুলি মেমরি ওয়াইস এবং প্রসেসিংয়ের সময়গুলির জন্য অত্যন্ত অদক্ষ -
ড্যান বসচেন

12

পাইথোনিক

X = X[:, :, None]

যা সমান

X = X[:, :, numpy.newaxis] এবং X = numpy.expand_dims(X, axis=-1)

তবে আপনি চিত্রগুলি স্ট্যাকিং সম্পর্কে স্পষ্টভাবে জিজ্ঞাসা করছেন, আমি আপনাকে একটি লুপে সংগৃহীত listচিত্রগুলির স্ট্যাকিংয়ের প্রস্তাব দিচ্ছি np.stack([X1, X2, X3])

আপনি যদি মাত্রার ক্রমটি পছন্দ করেন না তবে আপনি আবার সাজিয়ে নিতে পারেন np.transpose()


7

আপনি np.concatenate()কোনটি যুক্ত করবেন axisতা নির্দিষ্ট করে ব্যবহার করে ব্যবহার করতে পারেন np.newaxis:

import numpy as np
movie = np.concatenate((img1[:,np.newaxis], img2[:,np.newaxis]), axis=3)

আপনি যদি অনেক ফাইল থেকে পড়েন:

import glob
movie = np.concatenate([cv2.imread(p)[:,np.newaxis] for p in glob.glob('*.jpg')], axis=3)

2

নম্পিতে এমন কোনও কাঠামো নেই যা আপনাকে পরে আরও ডেটা যুক্ত করতে দেয়।

পরিবর্তে, নপি আপনার সমস্ত ডেটা সংখ্যার সংলগ্ন অংশে রাখে (মূলত: একটি সি অ্যারে), এবং কোনও আকার পরিবর্তন করতে এটি মেমরির একটি নতুন অংশ বরাদ্দ করা দরকার। নম্পির গতি মেমরির একই অংশে সমস্ত তথ্যকে একটি অলস অ্যারেতে রাখতে সক্ষম হওয়া থেকে আসে; যেমন গাণিতিক অপারেশন করা যেতে পারে গতির জন্য parallelized এবং আপনি কম পেতে ক্যাশে মিস

সুতরাং আপনার কাছে দুটি ধরণের সমাধান হবে:

  1. নমপি অ্যারের জন্য মেমরিটিকে প্রাক-বরাদ্দ করুন এবং জোশএডেলের উত্তরের মতো মানগুলি পূরণ করুন, বা
  2. আপনার ডেটাটিকে অজগর তালিকায় রাখুন যতক্ষণ না এগুলি সমস্ত একসাথে রাখার প্রয়োজন হয় (নীচে দেখুন)

images = []
for i in range(100):
    new_image = # pull image from somewhere
    images.append(new_image)
images = np.stack(images, axis=3)

মনে রাখবেন যে পৃথক চিত্রের অ্যারেগুলির মাত্রা প্রথমে প্রসারিত করার দরকার নেই, বা আপনার আগে সময়ের চেয়ে কতগুলি চিত্র আশা করবেন তাও জানতে হবে না।


2

পুনরায় আকারের পদ্ধতির সাথে অ্যাপ্রোচ 1 বিবেচনা করুন এবং একই ফলাফল উত্পন্ন করে এমন এনপি.নেস্যাক্সিস পদ্ধতিতে 2 পদ্ধতির সাথে বিবেচনা করুন:

#Lets suppose, we have:
x = [1,2,3,4,5,6,7,8,9]
print('I. x',x)

xNpArr = np.array(x)
print('II. xNpArr',xNpArr)
print('III. xNpArr', xNpArr.shape)

xNpArr_3x3 = xNpArr.reshape((3,3))
print('IV. xNpArr_3x3.shape', xNpArr_3x3.shape)
print('V. xNpArr_3x3', xNpArr_3x3)

#Approach 1 with reshape method
xNpArrRs_1x3x3x1 = xNpArr_3x3.reshape((1,3,3,1))
print('VI. xNpArrRs_1x3x3x1.shape', xNpArrRs_1x3x3x1.shape)
print('VII. xNpArrRs_1x3x3x1', xNpArrRs_1x3x3x1)

#Approach 2 with np.newaxis method
xNpArrNa_1x3x3x1 = xNpArr_3x3[np.newaxis, ..., np.newaxis]
print('VIII. xNpArrNa_1x3x3x1.shape', xNpArrNa_1x3x3x1.shape)
print('IX. xNpArrNa_1x3x3x1', xNpArrNa_1x3x3x1)

আমরা ফলাফল হিসাবে আছে:

I. x [1, 2, 3, 4, 5, 6, 7, 8, 9]

II. xNpArr [1 2 3 4 5 6 7 8 9]

III. xNpArr (9,)

IV. xNpArr_3x3.shape (3, 3)

V. xNpArr_3x3 [[1 2 3]
 [4 5 6]
 [7 8 9]]

VI. xNpArrRs_1x3x3x1.shape (1, 3, 3, 1)

VII. xNpArrRs_1x3x3x1 [[[[1]
   [2]
   [3]]

  [[4]
   [5]
   [6]]

  [[7]
   [8]
   [9]]]]

VIII. xNpArrNa_1x3x3x1.shape (1, 3, 3, 1)

IX. xNpArrNa_1x3x3x1 [[[[1]
   [2]
   [3]]

  [[4]
   [5]
   [6]]

  [[7]
   [8]
   [9]]]]

1

আমি এই পদ্ধতির অনুসরণ করেছি:

import numpy as np
import cv2

ls = []

for image in image_paths:
    ls.append(cv2.imread('test.jpg'))

img_np = np.array(ls) # shape (100, 480, 640, 3)
img_np = np.rollaxis(img_np, 0, 4) # shape (480, 640, 3, 100).
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.